2011-12-07 36 views
0

DB2是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 ...或者是否有解決方法? 非常感謝!

回答

0

不幸的是我意識到觸發器的內部不能檢測到觸發器所在的模式

但也有一些變通辦法(感謝@krmilligan太):

  • 拿走用戶的權限執行CPYLIB,讓他們使用的工具。
  • 在peridiocally運行的系統上創建一個後臺代理,查找不同步的觸發器。
  • 對於命令CPYLIB將默認設置爲TRG選項設置爲*NO。以這種方式觸發器將永遠不會被複制,除非用戶明確指定它。

我選擇最後一個,因爲它是最簡單的一個,即使可能存在需要觸發複製的上下文。在這種情況下,我會採取第一種解決方法。

1

HLL中定義的外部觸發器可以訪問觸發器緩衝區,該觸發器緩衝區包含觸發觸發器的表的庫名稱。這可以用來限定對MYLOGTABLE的引用。

有關更多信息,請參閱IBM Redbook Stored Procedures, Triggers, and User-Defined Functions on DB2 Universal Database for iSeries的第11.2章「觸發器程序結構」。

或者,您可以使用CURRENT SCHEMA特殊註冊表或GET DESCRIPTOR語句來查找觸發器和/或表當前所在的位置。

+0

謝謝!不幸的是'CURRENT SCHEMA'是默認的模式,或者是在執行'INSERT'之前用'SET SCHEMA'設置的模式。我正在嘗試'GET DESCRIPTOR' ...我必須設置一個描述符然後才能得到它嗎?我很困惑。 – bluish