如何:使用 SQL Server 2008 为自动更新修改日期创建触发器
Posted
技术标签:
【中文标题】如何:使用 SQL Server 2008 为自动更新修改日期创建触发器【英文标题】:How to: Create trigger for auto update modified date with SQL Server 2008 【发布时间】:2011-12-05 23:32:07 【问题描述】:很高兴知道如何创建一个自动更新我的 SQL Server 表中的modifiedDate
列的触发器:
表格TimeEntry
Id (PK)
UserId (FK)
Description
Time
GenDate
ModDate
触发码:
+ TR_TimeEntry_UpdateModDate()
+ TR_TimeEntry_InsertGenDate()
更新ModDate
的示例会很好。
【问题讨论】:
必须是触发器吗? 为什么在更新时不将列值设置为 TR_TimeEntry_UpdateModDate() = GetDate() ? 【参考方案1】:我的做法:
在ModDate
列上定义一个默认约束,其值为GETDATE()
- 这将处理INSERT
情况
有一个AFTER UPDATE
触发器来更新ModDate
列
类似:
CREATE TRIGGER trg_UpdateTimeEntry
ON dbo.TimeEntry
AFTER UPDATE
AS
UPDATE dbo.TimeEntry
SET ModDate = GETDATE()
WHERE ID IN (SELECT DISTINCT ID FROM Inserted)
【讨论】:
也值得考虑getUtcDate()
,具体取决于您的时区要求。
如果有人像我一样想知道这是否会递归调用自身,那么您通常会关闭一个 RECURSIVE_TRIGGERS 数据库选项,它可以防止这样的触发器调用自身。 msdn.microsoft.com/en-us/library/ms190739.aspx
我没听懂。我应该使用SET RECURSIVE_TRIGGERS
到ON
或OFF
来防止这种情况发生吗?
变量Inserted
从何而来?
@4ndro1d: Inserted
和 Deleted
是两个伪表,始终存在于每个触发器中。它们表示导致触发器触发的新插入或删除的行 - 对于UPDATE
,Inserted
包含UPDATE
操作之后 的新值,而@987654338 @ 有旧值之前更新以上是关于如何:使用 SQL Server 2008 为自动更新修改日期创建触发器的主要内容,如果未能解决你的问题,请参考以下文章
SQL server2008 临时表tempdb如何自动释放存储空间