0

DB2 for IBM System i 中,我创建了这个触发器来记录MYLOGTABLE每个插入操作MYCHECKEDTABLE

SET SCHEMA MYSCHEMA;

CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
     INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
         (MMACOD, OPTYPE, OPDATE)
     VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;

DBMS 使用MYSCHEMA.MYLOGTABLE硬编码存储触发器主体。

现在想象我们将整个模式复制为一个新模式NEWSCHEMA。当我在日志中插入一条记录时,NEWSCHEMA.MYCHECKEDTABLE记录将被添加到MYSCHEMA.MYLOGTABLE而不是NEWSCHEMA.MYLOGTABLE,即在触发器及其表所在的架构中。这是大问题的根源!!也因为许多用户可以在不受我控制的情况下复制模式......

那么,有没有办法在触发器主体中指定触发器所在的架构?这样我们就将日志记录写入正确的MYLOGTABLE. 像PARENT SCHEMA......或者有解决方法吗?非常感谢!

4

2 回答 2

1

在 HLL 中定义的外部触发器可以访问触发器缓冲区,该缓冲区包括触发触发器的表的库名称。这可用于限定对MYLOGTABLE.

有关更多信息,请参阅 IBM Redbook Stored Procedures, Triggers, and User-Defined Functions on DB2 Universal Database for iSeries的第 11.2 章“触发器程序结构” 。

或者,您可以使用CURRENT SCHEMA特殊寄存器或GET DESCRIPTOR语句来找出触发器和/或表当前所在的位置。

于 2011-12-07T09:34:58.513 回答
0

不幸的是,我意识到无法从触发器体内检测到触发器所在的架构。

但是有一些解决方法(也感谢@krmilligan):

  • 剥夺用户的执行权限CPYLIB,让他们使用实用程序。
  • 在系统上创建一个后台代理,该代理定期运行以查找不同步的触发器。
  • 对于命令,将选项CPYLIB的默认值设置为TRG*NO. 这样,触发器将永远不会被复制,除非用户明确指定它。

我选择最后一个是因为它是最简单的一个,即使可能存在需要触发副本的上下文。在这种情况下,我会采取第一种解决方法。

于 2011-12-20T16:38:40.220 回答