Database 指定触发器';触发器主体中的父模式
在DB2forIBMSystemi中,我创建了这个触发器,用于在Database 指定触发器';触发器主体中的父模式,database,triggers,database-schema,ibm-midrange,db2-400,Database,Triggers,Database Schema,Ibm Midrange,Db2 400,在DB2forIBMSystemi中,我创建了这个触发器,用于在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 be
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
中写入日志记录。类似于父模式
。。。或者是否有解决办法?
非常感谢 HLL中定义的外部触发器可以访问触发器缓冲区,该缓冲区包括触发触发器的表的库名称。这可用于限定对
MYLOGTABLE
的引用
有关更多信息,请参阅IBM红皮书的第11.2章“触发器程序结构”
或者,您可以使用特殊寄存器或语句找出触发器和/或表当前所在的位置。不幸的是,我意识到触发器所在的模式无法从触发器主体内部检测到 但也有一些解决办法(也要感谢):
- 剥夺用户执行
的权限,并让他们使用实用程序CPYLIB
- 在系统上创建一个后台代理,该代理会定期运行以查找不同步的触发器
- 对于命令
将CPYLIB
选项的默认值设置为TRG
。这样,触发器将永远不会被复制,除非用户明确指定它*NO
我选择最后一个是因为它是最简单的一个,即使在需要触发器复制的上下文中也是如此。在这种情况下,我会采取第一种解决方法。谢谢!不幸的是,
CURRENT SCHEMA
是默认模式,或者是在执行INSERT
之前刚刚用set SCHEMA
设置的模式。我正在尝试获取描述符。。。我是否必须设置一个描述符,然后才能得到它?我很困惑。