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

Posted

技术标签:

【中文标题】Derby Trigger on UPDATE:如何更新时间戳?【英文标题】:Derby Trigger on UPDATE: how to update a timestamp? 【发布时间】:2014-01-17 21:29:25 【问题描述】:

简短:如何在 Apache Derby DB 上创建触发器以更新更改记录的时间戳


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

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

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 所预期的那样。所以,还是没有解决办法。

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

【问题讨论】:

【参考方案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

【讨论】:

【参考方案2】:

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

在更新已更新列的投票后创建触发器 updateTimestamp REFERENCING OLD AS old FOR EACH ROW MODE DB2SQL UPDATE votes SET lastvoted = CURRENT_TIMESTAMP WHERE yourprimarykeycolumn=old.yourprimarykeycolumn;

【讨论】:

以上是关于Derby Trigger on UPDATE:如何更新时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver trigger(触发器)-更新某几列数据时触发

db2 for update of的用法

MYSQL trigger 个人记录

[PWA] 10. Trigger a version update

mysql—触发器trigger

SQL server 如何调试触发器!