【发布时间】:2012-09-17 15:18:53
【问题描述】:
这是简单跟踪数据库行更改的最佳方式吗:
ALTER TRIGGER [dbo].[trg_121s]
ON [dbo].[121s]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
update dbo.[121s]
set modified=getdate()
where id in
(select distinct ID from Inserted)
END
因此,对 [121s] 中行的任何更新都会导致 modified 列被更新。
它有效,但我不确定这是否是实现这一目标的最佳方式。
我对这条线有点困惑:
(select distinct ID from Inserted)
...以及它如何知道自己获得了正确的行 ID。
感谢您的任何确认/澄清,
标记
【问题讨论】:
-
在查询中使用
GetDate()会追逐移动的目标,会影响性能,并且可能会产生奇怪的结果,例如随着日期的变化。在变量中捕获当前日期/时间然后根据需要使用该值几乎总是一个更好的主意。这在多个语句中更为重要,就像在存储过程中一样。多次使用GetDate()的最常见原因是捕获长时间运行操作的开始和结束时间。 -
@HABO 除非所有行都用完全相同的更新时间戳标记是绝对关键的,否则我认为在这种情况下没有太大的问题。
-
我不确定,但我认为在声明中 getdate() 将为每一行返回相同的日期/时间。
-
@DumitrescuBogdan 我相当肯定在某些情况下这是不正确的,并且每行都会重新评估,但我承认我没有测试过这是否是其中之一。
-
@AaronBertrand 不理解我的意思,每当我写一个 sp 时,我总是从定义一些常量(比如时间)开始。但是我还没有看到在选择/更新/插入中,与 getdate() 不同的日期。正如我所说,我不确定。我会调查的。
标签: sql sql-server sql-server-2008