我的数据库中有几个模式。其中一些用于调试(我们称之为 DEV 模式),其他用于生产。为了将 DEV 模式与其他模式区分开来,我们使用一个具有名为 is_debug
的函数的包。默认情况下它返回false
。为了使模式成为 DEV,我们用返回 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
或系统
级别更改
Modifiable ALTER SESSION, ALTER SYSTEM
但是,您可以通过使用登录触发器
来克服此限制。假设您希望在任何人连接 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;
/
使用登录触发器
的一个优点是,您可以将大量设置应用于来自用户、操作系统用户以及您认为在默认上下文 sys_context 中可用的任何其他属性的连接
但是,只有当用户不自行设置标志时,此解决方案才有效。请记住,修改任何参数的alter session
权限是由create session
权限继承的。
此演示(作为 sys,我们创建一个仅具有创建 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
以此用户身份连接,仅具有创建 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>
因此,只要您的用户不是“作弊”,就可以在架构级别解决问题,根据连接者应用您想要的更改 session
。当然,如果您使用对架构具有权限的个人用户,则必须使用其他逻辑才能使其正常工作。我想你明白了。
关于oracle - 为架构设置 PLSQL_CCFLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69435614/