Derby Trigger on UPDATE:如何更新时间戳?

时间:2014-01-17 21:29:25

标签: sql database sql-update derby triggers

简介:如何在Apache Derby DB上创建一个触发器来更新已更改记录的时间戳?


调整现有项目以使用Apache Derby作为数据库软件, 我遇到了几个问题。大多数我可以使用stackoverflow和搜索引擎解决, 但对于这个,我请求你的帮助。

使用其他数据库软件,我会做这样的事情:

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

Derby不喜欢`而且你必须单独创建触发器。 所以我试试这个:

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不喜欢这句话中的第二个“UPDATE”。 但我不想插入或删除任何内容,我想更新已更改/将要更改的行的时间戳。

怎么做?

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

当没有合理的解决方案时,尝试一些魔法可能有所帮助。

我删除了括号(即使Derby文档和示例有这些括号)。

Derby告诉我它不喜欢BEFORE UPDATE触发器(wtf?),所以我回到AFTER,假设Derby知道它在那里做了什么。

最后,当CURRENT_TIMESTAMP是一个函数时,Derby反对括号,所以我也删除了它们。看起来很奇怪,但如果那是德比想要的......

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

现在这个被Apache Derby接受了。但执行它会导致触发循环,正如AFTER预期的那样。所以,仍然没有解决方案。

这是怎么做到的?在其他数据库上这么简单。德比也必须有一个解决方案。

2 个答案:

答案 0 :(得分:1)

尝试指定更新的列,它应该可以工作:

  

创建TRIGGER updateTimestamp更新后更新列ON投票   引用旧的每个行模式DB2SQL UPDATE投票SET   lastvoted = CURRENT_TIMESTAMP WHERE yourprimarykeycolumn = old.yourprimarykeycolumn;

答案 1 :(得分: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