CREATE_WRAPPED 过程 - 部署模糊化对象

CREATE_WRAPPED 过程会将纯文本 DDL 对象定义变换为模糊化 DDL 对象定义,然后在数据库中部署对象。

语法

在模糊化 DDL 语句中,过程逻辑和嵌入式 SQL 语句按如下方式进行编码:无法轻松抽取逻辑中的知识产权。

阅读语法图跳过直观语法图DBMS_DDL.CREATE_WRAPPED( object-definition-string)

参数

object-definition-string
包含 DDL 语句文本的 CLOB(2M) 类型的字符串,可以为下列一项内容 (SQLSTATE 5UA0O):
  • create procedure
  • create function
  • create package (PL/SQL)
  • create package body (PL/SQL)
  • create trigger
  • create view
  • alter module add function
  • alter module publish function
  • alter module add procedure
  • alter module publish procedure
该过程将输入变换为模糊化 DDL 语句字符串,然后动态执行该 DDL 语句。将使用在调用时生效的专用寄存器值(例如 PATH 和 CURRENT SCHEMA)以及当前调用者的权限。
编码由原始语句的前缀组成,并且包括例程签名或触发器、视图或包名称(后跟关键字 WRAPPED)。此关键字后跟有关执行过程的应用程序服务器的信息。信息的格式为“pppvvrrm”,其中:
  • ppp 使用字母 SQL 将产品识别为 Db2®
  • vv 是一个两位数版本标识,如“09”
  • rr 是一个两位数发行版标识,如“07”。
  • m 是一个一位字符修改级别标识,如“0”。
例如,V9.7 的修订包 2 将标识为“SQL09072”。此应用程序服务器信息后跟一个字母字符串(a-z 和 A-Z)、数字 (0-9)、下划线和冒号。除了在模糊化后仍可保持可读的前缀之外,不会对输入语句进行任何语法检查。
已编码的 DDL 语句长度通常超过该语句的纯文本格式。如果结果超过 SQL 语句的最大长度,那么将出现错误 (SQLSTATE 54001)。
注: 语句的编码意味着模糊化内容,并且不应被视为强加密形式。

权限

对 DBMS_DDL 模块的 EXECUTE 特权。

示例

  • 创建一个模糊化函数,用以根据每小时工资来计算年薪(规定每周 40 小时)
    CALL DBMS_DDL.CREATE_WRAPPED('CREATE FUNCTION ' ||                                          
                       'salary(wage DECFLOAT) ' ||
                       'RETURNS DECFLOAT ' ||
                       'RETURN wage * 40 * 52');
    SELECT text FROM SYSCAT.ROUTINES 
     WHERE routinename = 'SALARY' 
        AND routineschema = CURRENT SCHEMA;

    在成功执行 CALL 语句后,与例程“SALARY&”相对应的行的 SYSCAT.ROUTINES.TEXT 列将类似于以下格式:

    CREATE FUNCTION salary(wage DECFLOAT) WRAPPED SQL09072 obfuscated-text
  • 创建一个用于设置复杂缺省值的模糊化触发器
    CALL DBMS_DDL.CREATE_WRAPPED('CREATE OR REPLACE TRIGGER ' ||
                       'trg1 BEFORE INSERT ON emp ' ||
                       'REFERENCING NEW AS n ' ||
                       'FOR EACH ROW ' ||
                       'WHEN (n.bonus IS NULL) ' ||
                       'SET n.bonus = n.salary * .04');
    SELECT text FROM SYSCAT.TRIGGERS
     WHERE trigname = 'TRG1' 
       AND trigschema = CURRENT SCHEMA;

    在成功执行 CALL 语句后,与触发器“TRG1”相对应的行的 SYSCAT.TRIGGERS.TEXT 列将类似于以下格式:

    CREATE OR REPLACE TRIGGER trg1 WRAPPED SQL09072  obfuscated-text