Sql server 如何在SQL Server中为更新表创建删除后触发器

Sql server 如何在SQL Server中为更新表创建删除后触发器,sql-server,triggers,Sql Server,Triggers,我正在尝试创建一个触发器,在删除database.t_用户中的一行时更新database.t_pmessage中的行 create trigger [dbo].[deleteUser] on [dbo].[t_user] after delete as BEGIN update t_PMmessage set receiverID_FK = null where receiverID_FK IN(SELEC

我正在尝试创建一个触发器,在删除database.t_用户中的一行时更新database.t_pmessage中的行

create trigger [dbo].[deleteUser]
 on [dbo].[t_user]
     after delete
      as
        BEGIN 
            update t_PMmessage set receiverID_FK = null
            where receiverID_FK IN(SELECT deleted.userID FROM deleted)
        END
但当我从t_用户删除时,我得到以下错误:

After delete触发器在delete语句执行后触发,因此delete语句在建议的触发器中的update语句之前执行,并且您会得到外键约束冲突

取而代之,触发器将触发而不是您发出的delete语句,并将首先更新
t\PMmessage
,然后更新delete语句

还可以使用Exists运算符而不是IN运算符

您需要一个类似于….的而非删除触发器

create trigger [dbo].[deleteUser]
on [dbo].[t_user]
INSTEAD OF DELETE
as
BEGIN 

update t_PMmessage 
    set receiverID_FK = null
where EXISTS (SELECT 1 
              FROM deleted 
              WHERE  deleted.userID  = t_PMmessage.receiverID_FK )

DELETE FROM [dbo].[t_user]
where EXISTS (SELECT 1 
              FROM deleted 
              WHERE  deleted.userID  = [t_user].userID  )


END

After delete触发器在delete语句执行后激发,因此delete语句在建议的触发器中的update语句之前执行,并且您得到外键约束冲突

取而代之,触发器将触发而不是您发出的delete语句,并将首先更新
t\PMmessage
,然后更新delete语句

还可以使用Exists运算符而不是IN运算符

您需要一个类似于….的而非删除触发器

create trigger [dbo].[deleteUser]
on [dbo].[t_user]
INSTEAD OF DELETE
as
BEGIN 

update t_PMmessage 
    set receiverID_FK = null
where EXISTS (SELECT 1 
              FROM deleted 
              WHERE  deleted.userID  = t_PMmessage.receiverID_FK )

DELETE FROM [dbo].[t_user]
where EXISTS (SELECT 1 
              FROM deleted 
              WHERE  deleted.userID  = [t_user].userID  )


END

对于不需要使用触发器的情况,请在删除集NULL时添加约束
。对于不需要使用触发器的情况,请在删除集NULL时添加约束