2014-01-29 78 views
1

我有以下存儲過程:IBM DB2觸發需要幫助

CREATE PROCEDURE UPDATE_MODIFICATION_DATE (IN TBLNAME VARCHAR(30), IN ROWID INTEGER) 
P1: BEGIN 
    DECLARE store VARCHAR(1000); 
    SET store = 'UPDATE ' || TBLNAME || ' SET modification_date=CURRENT TIMESTAMP WHERE  id='||ROWID; 
    PREPARE command FROM store; 
    EXECUTE command; 
END P1 

它得到一個表的名稱,行的ID,並更新modification_date欄爲當前的時間戳。

我不知道如何編寫觸發器,每次成功更新或插入表後都會調用此過程。 (所以我想要完成的是存儲一行最後一次觸摸時)。

+3

手冊中有很多觸發器示例。我認爲更新觸發器中的'modification_date'會比在單獨的存儲過程中調用動態SQL更好。 – mustaccio

+0

表名可以超過30個字符(我相信iSeries上的「easy」限制是32,但即使這樣也可以更長)。爲了幫助避免SQL注入,您可能需要根據sysinfo表進行驗證。它如何與多個模式交互 - 它是否默認爲調用觸發器的模式,用戶的模式,編譯過程的模式?像@Charles一樣改變表格可能是最好的長期解決方案 - 這是否行得通?否則,如果你正在定義一個觸發器,我與@mustaccio ...(這是'更新前'的原因......) –

回答

1

爲什麼不將修改定義爲ROW CHANGE TIMESTAMP?然後db2會自動更新它。

+0

當然,我認爲這是最好的長期選擇,對於一個數字的原因。也許他不允許「修改」表,或者他的db不支持它(舊版本)? +1,儘管也許你還應該包含一個示例'ALTER TABLE'腳本。 –