Sql server 在SQL Server中创建更新触发器

Sql server 在SQL Server中创建更新触发器,sql-server,Sql Server,我需要从表A中删除行ID与表B中更新的行ID相同的行。因此,我假设我需要创建一个更新后触发器 例如:如果表B的time列中的行ID为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

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

例如:如果表B的
time
列中的行ID为
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
中更新的rowid相同的所有行?

您可以使用
删除。。。从

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

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

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

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\u NESTLEVEL()
检查来防止递归出现问题(这不是单个触发器的问题,但通常是个好主意).

它给出了一个错误,说明关键字附近的语法不正确INNER@Simran抱歉-刚刚修正了输入错误。一些示例会很有用。到谢谢。看起来不错。不过,我有一个简短的问题。何时刷新插入表中的值?我问这个问题,我担心意外删除。是否为每个触发器填充值,然后在触发器完成后立即从inserted中删除它应该执行的操作?
inserted
中的行仅在触发器执行时存在。如果触发器触发触发自身或另一个触发器(一个非常难控制的场景),那么这些触发器会得到新的插入的表,这些表反映了这些插入,但是对于正常的使用,你可以认为它是在触发器完成后消失的临时表。