对 SQL 例程或 SQL 触发器进行模糊处理

可以对 SQL 函数,过程和触发器进行模糊处理,以使其例程主体逻辑和语句在系统上不可见。

对 SQL 过程,函数或触发器的测试完成后,您可以对文本进行模糊处理,以便系统上的任何人都无法读取该文本。 要执行此操作,请使用 WRAP SQL 函数或 CREATE_WRAP SQL 过程。 这两个例程都是模式 SYSIBMADM 中的系统提供的例程。

WRAP 标量函数返回作为输入自变量提供的 SQL 语句的模糊化格式。 CREATE_WRAPPED 过程将对 SQL 语句进行模糊处理,然后执行该语句。

创建模糊化例程时,例程主体将不会在目录表或程序对象中显示。 将不会生成列表,并且将删除在创建例程期间使用的任何临时文件。 该例程将始终创建为不可调试,因此不存在包含例程内容的调试视图。

IBM® i Access Client Solutions (ACS) 的 "生成 SQL "功能有一个选项,可以方便地一次混淆多个 SQL 例程。

一旦对例程进行了模糊处理,就可以将 SQL 例程的程序或服务程序对象保存并复原到其他系统。 它可用作 IBM i Access Client Solutions (ACS) 的生成 SQL 功能的对象。 Db2 for i 了解如何正确处理语句,因此它将保持混淆状态。

例如,假设您的过程是:
CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END;
在测试过程以确保其工作后,您可以使用 WRAP 函数生成语句的模糊化形式。
VALUES(SYSIBMADM.WRAP(
'CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END'
));
此语句的结果是包含类似于以下语句的值的 CLOB 值。 由于时间戳记是在模糊处理过程中使用的,因此每次结果可能不同。 为了方便起见,此值显示在几行上。 语句文本的换行部分中不允许使用换行符。
CREATE PROCEDURE UPDATE_STAFF ( IN P_EMPNO CHAR ( 6 ) , IN P_NEWJOB CHAR ( 5 ) 
, IN P_DEPT INTEGER )  WRAPPED QSQ07010 aacxW8plW8FjG8pnG8VzG8FD68Fj68:Hl8:dY_p
B2qpdW8pdW8pdW_praqebaqebaGEMj_vsPBs5bOJUUqnHVayEl_ogAlGWqz2jJCIE1dQEjt33hd5Sps
5cYGViD1urv7vGKeOcC4CwpCibbmeMfsW3XzXWnlplyX9wunOCqqFiDqaBl   
这是可执行的 SQL 语句。 它可以像原始 SQL 语句一样运行。 更改 WRAPPED 关键字后面的任何字符将导致语句失败。

要部署此语句,可以将模糊化格式嵌入到 RUNSQLSTM 源成员或源流文件中。 您需要非常小心地将字符完全包含在模糊版本中。

对 SQL 例程进行模糊处理的第二种方法是使用 CREATE_WRAPPED SQL 过程:
CALL SYSIBMADM.CREATE_WRAPPED(
'CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END'
);

这将创建过程,并且将对整个 SQL 例程主体进行模糊处理。 查看SYS例程中的 ROUTINE_DEFINITION 列将显示例程主体的模糊化格式 (从 WRAPPED 关键字开始)。 如果您可能需要原始例程源以供将来参考,那么必须保存原始例程源,因为无法从模糊文本生成原始源。