oracle - 为架构设置 PLSQL_CCFLAGS

标签 oracle plsql conditional-compilation

我的数据库中有几个模式。其中一些用于调试(我们称之为 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/

相关文章:

sql - 获取去年同一周的同一天

oracle - 计算表中的记录并使用游标更新表

java - 我似乎无法从 PLSQL 调用 java

testing - 为条件编译定义自定义属性的正确方法是什么?

c++ - 在不同的编译单元中使用不同的编译标志编译相同的 header

java - Apple 弃用 Java。 Apple 特定的定制是否仍可与其他 JRE/JVM 一起使用?

oracle - DBMS_JOB和DBMS_SCHEDULER

php - [Oracle/PHP]是否可以将数组传递给 PL/SQL 过程?

oracle - 使用 pl/sql 渲染 html 并获取其源代码的最简单方法

c - #if defined 函数定义的用法