简介:如何在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预期的那样。所以,仍然没有解决方案。
这是怎么做到的?在其他数据库上这么简单。德比也必须有一个解决方案。
答案 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