【发布时间】:2015-10-20 23:48:27
【问题描述】:
我的 SQL 知识非常有限,因为我主要专注于后端 Ruby 开发。然而,由于架构的变化并希望保持良好的设计;我决定在数据库级别而不是后端级别设置时间戳。
现在,我所有的表都有两列:CreatedAt 和 UpdatedAt,两者的默认值都是 GETDATE()。
但是,我现在需要为 UpdatedAt 设置时间戳触发器,以便每次更新一行(或多行)时,这些行的 UpdatedAt 列都会获得一个全新的时间戳。
我在编写以下触发器时遇到问题。我收到一个错误:
'=' 附近的语法不正确
我首先在我的 Orders 表上测试我的触发器,然后我计划将该功能移动到所有表。
CREATE TRIGGER dbo.trgTimestampAfterUpdate
ON Dbo.Orders
AFTER UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted)
BEGIN
SET UpdatedAt = GETDATE()
END
END
我知道我可以在使用触发器时访问插入和删除的虚拟表。我对这个查询的想法是,我将使用 insert 来区分哪些行已被更新。如果有人可以提供帮助,那就太好了,而且如果您不介意向我解释我的语法或思路有什么问题,我们将不胜感激。
【问题讨论】:
-
您是否考虑过使用 INSTEAD OF 触发器?
-
UPDATE o SET UpdatedAt = GETDATE() FROM dbo.Orders AS o INNER JOIN inserted AS i ON o.key_column = i.key_column;您实际上并不需要执行IF EXISTS检查 - 这只是更新中固有的额外的、不必要的操作。 -
我没有。我会去调查它@CodeMagician。这是否需要更大的查询?此表中行的大部分更新将通过表单进行,并且可能会同时更新许多不同的列。
-
这将需要额外的代码,并且有一些维护负担,因为对表的更改通常需要对触发器进行更改。我只喜欢那个解决方案,因为我喜欢避免触发器可能触发触发器并导致问题。我在下面的答案中写了一个安全的解决方案。
标签: sql-server triggers