我在表格中有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。
你能帮我解决一下我的问题吗?
谢谢。
答案 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;
您实际上并不需要条件逻辑,因为join
和where
子句会处理这个问题。