为架构设置 PLSQL_CCFLAGS
Set PLSQL_CCFLAGS for the schema
我的数据库中有几个模式。其中一些用于调试(我们称之为 DEV 模式),其他用于生产。为了将 DEV 模式与其他模式区分开来,我们使用一个包,该包具有名为 is_debug
的函数。默认情况下它 return false
。为了使模式成为 DEV,我们用 returns true
的函数替换这个包并编译它。
但是,最近我了解了条件编译和 PLSQL_CCFLAGS。而且我认为使用标志将 DEV 模式与其他模式区分开来可能会更好。但它只能设置为DATABASE 和SESSION。我想将它设置为 SCHEMA,以便该模式中的每个包都可以使用它。可能吗?
如文档所述
PLSQL_CCFLAGS provides a mechanism that allows PL/SQL programmers to
control conditional compilation of each PL/SQL library unit
independently.
并且只能在 session
或 system
级别更改
Modifiable ALTER SESSION, ALTER SYSTEM
但是,您可以通过使用 logon trigger
来克服此限制。假设您想在任何人与 SCHEMA_DEV 连接时将此调试更改为 true,并在他们与任何其他人连接时将其保留为 false
create or replace trigger sys.logon_flags_plsql
after logon on database
declare
v_true varchar2(200) := 'ALTER SESSION SET PLSQL_CCFLAGS = ''debug:TRUE'' ';
v_false varchar2(200) := 'ALTER SESSION SET PLSQL_CCFLAGS = ''debug:FALSE'' ';
v_user varchar2(128);
v_os_user varchar2(128);
begin
SELECT UPPER(SYS_CONTEXT ('USERENV', 'SESSION_USER')),
UPPER(SYS_CONTEXT('USERENV', 'OS_USER')),
INTO
v_user,
v_os_user
FROM DUAL;
--
if v_user in ( 'SCHEMA_PRE', 'SCHEMA_PRO' )
then
execute immediate v_false;
elsif v_user = 'SCHEMA_DEV'
then
execute immediate v_true;
else
null; -- or whatever you consider to
end if;
end;
/
使用 logon triggers
的一个优点是您可以将大量设置应用于来自用户、操作系统用户以及您可以想到的任何其他 属性 在默认上下文中可用的连接sys_context
但是,此解决方案仅在用户未自行设置标志时有效。请记住,修改任何参数的权限 alter session
由权限 create session
.
继承
这个演示(作为 sys,我们创建一个只有 create session
权限的用户)
SQL> create user test3 identified by Oracle_1234 ;
User created.
SQL> grant create session to test3 ;
Grant succeeded.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0
作为该用户连接,只有 create session
权限
$ sqlplus test3/Oracle_1234
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 4 14:39:47 2021
Version 19.6.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0
SQL> alter session SET PLSQL_CCFLAGS = 'debug:FALSE' ;
Session altered.
SQL>
因此,只要您的用户没有“作弊”,这就可以在架构级别解决问题,根据连接的用户应用您想要的 alter session
。当然,如果您使用的是对架构具有特权的个人用户,则必须使用另一种逻辑才能使其正常工作。我想你明白了。
我的数据库中有几个模式。其中一些用于调试(我们称之为 DEV 模式),其他用于生产。为了将 DEV 模式与其他模式区分开来,我们使用一个包,该包具有名为 is_debug
的函数。默认情况下它 return false
。为了使模式成为 DEV,我们用 returns true
的函数替换这个包并编译它。
但是,最近我了解了条件编译和 PLSQL_CCFLAGS。而且我认为使用标志将 DEV 模式与其他模式区分开来可能会更好。但它只能设置为DATABASE 和SESSION。我想将它设置为 SCHEMA,以便该模式中的每个包都可以使用它。可能吗?
如文档所述
PLSQL_CCFLAGS provides a mechanism that allows PL/SQL programmers to control conditional compilation of each PL/SQL library unit independently.
并且只能在 session
或 system
级别更改
Modifiable ALTER SESSION, ALTER SYSTEM
但是,您可以通过使用 logon trigger
来克服此限制。假设您想在任何人与 SCHEMA_DEV 连接时将此调试更改为 true,并在他们与任何其他人连接时将其保留为 false
create or replace trigger sys.logon_flags_plsql
after logon on database
declare
v_true varchar2(200) := 'ALTER SESSION SET PLSQL_CCFLAGS = ''debug:TRUE'' ';
v_false varchar2(200) := 'ALTER SESSION SET PLSQL_CCFLAGS = ''debug:FALSE'' ';
v_user varchar2(128);
v_os_user varchar2(128);
begin
SELECT UPPER(SYS_CONTEXT ('USERENV', 'SESSION_USER')),
UPPER(SYS_CONTEXT('USERENV', 'OS_USER')),
INTO
v_user,
v_os_user
FROM DUAL;
--
if v_user in ( 'SCHEMA_PRE', 'SCHEMA_PRO' )
then
execute immediate v_false;
elsif v_user = 'SCHEMA_DEV'
then
execute immediate v_true;
else
null; -- or whatever you consider to
end if;
end;
/
使用 logon triggers
的一个优点是您可以将大量设置应用于来自用户、操作系统用户以及您可以想到的任何其他 属性 在默认上下文中可用的连接sys_context
但是,此解决方案仅在用户未自行设置标志时有效。请记住,修改任何参数的权限 alter session
由权限 create session
.
这个演示(作为 sys,我们创建一个只有 create session
权限的用户)
SQL> create user test3 identified by Oracle_1234 ;
User created.
SQL> grant create session to test3 ;
Grant succeeded.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0
作为该用户连接,只有 create session
权限
$ sqlplus test3/Oracle_1234
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 4 14:39:47 2021
Version 19.6.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0
SQL> alter session SET PLSQL_CCFLAGS = 'debug:FALSE' ;
Session altered.
SQL>
因此,只要您的用户没有“作弊”,这就可以在架构级别解决问题,根据连接的用户应用您想要的 alter session
。当然,如果您使用的是对架构具有特权的个人用户,则必须使用另一种逻辑才能使其正常工作。我想你明白了。