2014-01-17 59 views
0

簡介:如何在Apache Derby數據庫上創建觸發器,用於更新已更改記錄上的時間戳?更新Derby觸發器:如何更新時間戳?


適應我所遇到的一些問題的現有項目使用Apache Derby作爲數據庫軟件, 。大多數我可以使用stackoverflow和搜索引擎, 解決,但對於這一個我請求你的幫助。

與其他數據庫軟件,我會做這樣的事情:

CREATE TABLE myTable (
… 
`lastchange` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
… 
) 

德比不喜歡',你必須單獨創建觸發器。 所以我試試這個:

CREATE TRIGGER updateTimestamp AFTER UPDATE ON mytable FOR EACH ROW 
(UPDATE mytable SET lastchange= CURRENT_TIMESTAMP()) 

我得到一個錯誤。哦,這個更新可能會導致觸發器再次關閉......所以

CREATE TRIGGER updateTimestamp NO CASCADE BEFORE UPDATE ON mytable FOR EACH ROW 
(UPDATE mytable SET lastchange= CURRENT_TIMESTAMP()) 

會更好,對不對?

好吧,要麼給我一個錯誤,告訴德比不喜歡這個聲明中的第二個「更新」。 但我不想插入或刪除任何東西,我想更新已更改/將被更改的行上的時間戳。

如何做到這一點?

------更新------

如果沒有合理的解決方案,嘗試一些魔術可能會有所幫助。

我刪除了括號(儘管Derby文檔和示例有它們)。

德比告訴我它不喜歡BEFORE上UPDATE觸發器(跆拳道?),所以我回到AFTER,假設德比知道它在那裏做什麼。

最後,雖然CURRENT_TIMESTAMP是一個函數,但Derby反對括號,所以我也刪除了它們。看起來不可思議,但如果這就是德比想要的...

CREATE TRIGGER updateTimestamp AFTER UPDATE ON votes FOR EACH ROW UPDATE 
votes SET lastvoted = CURRENT_TIMESTAMP 

現在這個是由Apache Derby的接受。但是執行它會導致一個觸發器循環,就像AFTER預期的那樣。所以,仍然沒有解決方案。

這是如何完成的?在其他數據庫中非常簡單。德比也需要一個解決方案。

回答

1

準確地說,你必須要聽更新表指定柱(顯然不包括lastvoted列)。

CREATE TRIGGER updateTimestamp 
AFTER UPDATE OF col1, col2, col3... ON votes 
REFERENCING OLD AS EXISTING 
FOR EACH ROW MODE DB2SQL 
    UPDATE votes SET lastvoted = CURRENT_TIMESTAMP 
    WHERE pkcolumn = EXISTING.pkcolumn 
1

嘗試指定更新的列,它應該工作:

CREATE TRIGGER updateTimestamp UPDATE updatedcolumn票數 REFERENCING舊如舊FOR EACH ROW模式DB2SQL UPDATE票SET後 lastvoted = CURRENT_TIMESTAMP WHERE yourprimarykeycolumn =老。yourprimarykeycolumn;