为架构设置 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.

并且只能在 sessionsystem 级别更改

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。当然,如果您使用的是对架构具有特权的个人用户,则必须使用另一种逻辑才能使其正常工作。我想你明白了。