【发布时间】:2014-01-17 21:29:25
【问题描述】:
简短:如何在 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
现在 this 已被 Apache Derby 接受。但是执行它会导致触发循环,正如 AFTER 所预期的那样。所以,还是没有解决办法。
这是怎么做到的?在其他数据库上非常简单。德比也必须有一个解决方案。
【问题讨论】:
标签: sql database sql-update derby triggers