使用"在(...)"中进行组更新后触发执行查询中的语句

时间:2015-12-21 21:47:39

标签: sql sql-server tsql triggers

我在表格中有AFTER UPDATE触发器:

ALTER TRIGGER [dbo].[table1] 
   ON  [dbo].[table]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @primaryKey bigint
    SELECT @PrimaryKey = PK FROM Inserted
    if EXISTS(select * from [dbo].[table1] where PK=@PrimaryKey)
    begin
        update [dbo].[table1] set [Action] = 'U' where PK=@PrimaryKey
    end
    else
    begin
        insert into [dbo].[table1] ([PK], [Action], StampIn) 
        values (@PrimaryKey, 'U', GETDATE())
    end
END

当我做"更新SOME_DB.dbo.TABLE时设置FIELD =' NEW VALUE'在(3,4,5)"中的PK中,我发现只有一行用PK" 3"添加到table1中。这意味着触发器仅在表中执行一次。

但我需要将table1中的所有行都更新为PK。

你能帮我解决一下我的问题吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

SQL触发器使用inserted视图来标识所有要插入的行。你的逻辑只看其中一行;因此它没有达到预期的效果。所以:

BEGIN
    SET NOCOUNT ON;

    update t1
         set [Action] = 'U'
         from table1 t1 join
              inserted i
              on i.primarykey = t1.pk ;
    insert into [dbo].[table1] ([PK], [Action], StampIn) 
       select i.primarykey, 'U', getdate()
       from inserted i
       where not exists (select 1 from dbo.table1 t1 where t1.pk = i.primarykey);
END;

您实际上并不需要条件逻辑,因为joinwhere子句会处理这个问题。