我需要删除表A中的行,其中行ID与表B中更新的rowId相同。因此,我假设我需要创建一个更新后的触发器。
例如:如果表B中更新了行ID time
,1
,2
的行中的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
中更新的行相同?
答案 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