【问题标题】:Specify trigger's parent schema in trigger body在触发器主体中指定触发器的父架构
【发布时间】:2011-12-07 08:20:01
【问题描述】:

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,即在触发器及其表所在的架构中。这是大问题的根源!!也因为许多用户可以在不受我控制的情况下复制架构...

那么,有没有办法在触发器主体中指定触发器所在的架构?这样我们就可以将日志记录写入正确的MYLOGTABLEPARENT SCHEMA... 之类的东西还是有解决方法? 非常感谢!

【问题讨论】:

    标签: database triggers database-schema ibm-midrange db2-400


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!不幸的是,CURRENT SCHEMA 是默认模式,或者是在执行INSERT 之前用SET SCHEMA 设置的模式。我正在尝试GET DESCRIPTOR...我是否必须设置一个描述符然后才能得到它?我很困惑。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多