
CREATE_WRAPPED存储过程
CREATE_WRAPPED 程序将可读数据定义语句编码为混淆数据定义语句,然后将对象部署到数据库中。 混淆数据定义语句中的程序逻辑和嵌入的SQL语句被打乱,以至于逻辑中的任何知识产权都无法轻易提取。
模式为 SYSIBMADM。
- 对象定义字符串
- 任何内置字符类型字符串,包含以下数据定义语句:
- CREATE FUNCTION(已编译的SQL标量)
- CREATE FUNCTION(内联SQL标量)
- CREATE FUNCTION(SQL 表)
- CREATE PROCEDURE (SQL - 原生)
- 创建触发器(基本)
- 创建触发器(高级)
对象定义字符串不能是位数据,也不能包含关键词“版本”。
该程序将输入编码为混淆的数据定义语句字符串,然后动态执行该数据定义语句。 编码语句由以下部分组成:
- 原始声明,包括常规签名或触发名称。
- WRAPPED关键词。
- 调用函数的数据库管理器的标识符。产品标识符(PRDID)值是一个8字节字符值,采用 pppvvrrm格式 ,其中: ppp 是3个字母的产品代码; vv 是版本;rr 是发行版; m 是修改级别。 在 Db2 12 for z/OS® 中,修改级别表示一系列功能级别:
- DSN12015适用于 V12R1M500 或更高版本。
- DSN12010致 V12R1M100。
更多信息,请参阅 Db2 for z/OS 中的产品标识符 (PRDID) 值。
- 数据定义语句的编码剩余部分,由字母(a-z和A-Z)、数字(0-9)、下划线和冒号组成。 在编码前,它被转换为Unicode UTF-8。 如果对象定义字符串无法转换,或者中间字符串超出SQL语句的最大长度,则会产生错误。 如果字符转换为替换字符,则会发出警告。
编码的数据定义语句的长度最多可以是纯文本形式语句长度的三分之一。 如果结果超出SQL语句的最大长度,则会发出错误。
示例
- 示例 1
- 以下过程调用产生了一个模糊版本的函数,该函数根据每周40小时的小时工资计算年薪。
CALL CREATE_WRAPPED('CREATE FUNCTION salary(wage DECFLOAT) RETURNS DECFLOAT RETURN wage * 40 * 52'); SELECT TEXT FROM SYSIBM.SYSROUTINES WHERE NAME ='SALARY' AND SCHEMA = CURRENT SCHEMA;结果类似于以下表格:
CREATE FUNCTION salary(wage DECFLOAT) WRAPPED DSN12015 ablGWmdiWmtyTmduTmJqTmtaUmtCUmZqUmdiXodK3idaWmdaWmdaWmZG1mIaG icaGy31TyStm_qGbe3sDxdxjtC8ymVGLpMXnuL8lkmNuRhhZ6qYJ2YYdXGaa - 示例 2
- 以下过程调用会产生一个混淆版本的触发器,用于设置复杂的默认值
CALL CREATE_WRAPPED('CREATE OR REPLACE TRIGGER trig1 BEFORE INSERT ON emp REFERENCING NEW AS n FOR EACH ROW WHEN (n.bonus IS NULL) SET n.bonus = n.salary * .04') SELECT STATEMENT FROM SYSIBM.SYSTRIGGERS WHERE NAME='TRIG1' AND SCHEMA= CURRENT SCHEMA;结果类似于以下表格:
CREATE TRIGGER trig1 WRAPPED DSN12015 ablGWmdiWmtyTmduTmJqTmtaUmtGUnteUmZKWmtqWidaWmdaWmdaXmdyWncaGica GK6ot_81NzyodncdrRIJFp_tBjpJeIwg_dTKNHcdtHPSaNCpmqBKH2pMwExkRTJW Zr:dJd0_gSbehW:4Xx1UGPGnDxvmJfa5ZAGOr_1sfFiyaPrkOXzt5UMTmsASfyJR ksbPfM2dlATbq:0RW

