【问题标题】:SQL Server 2008 R2 TriggerSQL Server 2008 R2 触发器
【发布时间】:2014-01-19 20:19:41
【问题描述】:

我知道有很多关于这方面的问题,但在阅读之后,似乎没有人遇到和我一样的麻烦。

背景信息:我希望对多维数据集进行增量更新,但表上没有更新时间戳。我现在正在考虑创建一个独立表,该表在更新记录时通过带有 gkey 和当前日期时间戳的触发器进行更新。

我在桌子上的触发器如下:

CREATE TRIGGER trgAfterUpdateVisitDetails ON  [visit_details]
FOR UPDATE
AS  
begin
   declare @VD_Gkey nvarchar
   declare @today DATETIME = SYSDATETIME()

   insert into [UpdatedVD]
     SELECT 
        @VD_Gkey, @today
     FROM 
        [visit_details]
End

这给了我一个类似下面的输出,但有 917 行相同:

+---------+-------------------------+
| VD_Gkey |          today          |
+---------+-------------------------+
| NULL    | 2014-01-02 11:21:23.963 |
| NULL    | 2014-01-02 11:21:23.963 |
+---------+-------------------------+

我知道这将是一件非常简单的事情,但我无法理解这一点。

任何帮助都会很棒。

谢谢。

【问题讨论】:

  • 您的触发器没有引用 InsertedDeleted 伪表,其中包含有关那些实际受 UPDATE 操作影响的行的信息...您需要 加入 这两个伪表中的任何一个,以将您的INSERT 语句限制为那些实际更新的行!

标签: sql sql-server sql-server-2008 tsql triggers


【解决方案1】:

您只需要访问inserted and deleted 伪表:

CREATE TRIGGER trgAfterUpdateVisitDetails ON  [visit_details]
FOR UPDATE
AS  
begin
    insert into 
        [UpdatedVD]
    SELECT 
        i.VD_Gkey, CURRENT_TIMESTAMP
    FROM
        inserted i;
End

【讨论】:

  • 因为它是一个更新触发器,并且我假设VD_Gkey 是一个不会更新的PK,所以在这里使用inserteddeleted 并不重要.显然,在一般情况下,deleted 将包含旧值,inserted 将包含更新后的新值。
  • @Lala:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多