在SQL Server中创建更新触发器

时间:2015-03-03 14:27:10

标签: sql-server

我需要删除表A中的行,其中行ID与表B中更新的rowId相同。因此,我假设我需要创建一个更新后的触发器。

例如:如果表B中更新了行ID time12的行中的3列,则表A应删除具有行ID的行1,2和3。

这就是我的尝试:

CREATE TRIGGER trgAfterUpdate ON [dbo].[Patients] 
FOR UPDATE
AS  
    DECLARE @row INT

    SELECT @row = (SELECT RowId FROM Inserted)

    IF UPDATE (ModifiedAt)
       DELETE FROM dbo.CACHE 
       WHERE Cache.RowId = @row
GO

但是,如果有批量更新,触发器只会被触发一次。如何从dbo.Cache删除所有行,其rowid与dbo.Patients中更新的行相同?

3 个答案:

答案 0 :(得分:2)

您必须以基于集合的方式编写触发器,例如;

CREATE TRIGGER trgAfterUpdate ON [dbo].[Patients] FOR UPDATE
AS  

   if update(ModifiedAt)
      delete c from dbo.CACHE c INNER JOIN inserted i on i.RowId = c.RowId

GO

答案 1 :(得分:1)

inserted是一个包含所有更新的表格;你可以这样使用它。

CREATE TRIGGER trgAfterUpdate ON [dbo].[Patients]
FOR UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF TRIGGER_NESTLEVEL() > 1 RETURN;

    IF UPDATE([ModifiedAt])
        DELETE dbo.Cache WHERE RowID IN (SELECT RowID FROM inserted)
END

请注意,我正在使用SET NOCOUNT ON来确保触发器不会返回任何额外的结果并进行TRIGGER_NESTLEVEL()检查以防止递归问题(对于单个触发器来说不是问题,而是一个好的一般的想法)。

答案 2 :(得分:0)

您可以使用DELETE ... FROM

DELETE FROM dbo.Cache FROM dbo.Cache JOIN inserted I ON I.RowId=Cache.id