Database 指定触发器';触发器主体中的父模式

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

在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 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
设置的模式。我正在尝试
获取描述符
。。。我是否必须设置一个描述符,然后才能得到它?我很困惑。