如何在SQL Server中创建一个删除前触发器?

use*_*263 24 sql-server triggers

我想创建一个删除前触发器.当我从表中删除记录时,该记录必须插入到历史表中.我怎么能在SQL Server中执行此操作?

Cod*_*ian 34

在这种情况下,你可能最好做一个常规的"后"触发器.这是解决此类情况的最常见方法.

就像是

CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
     INSERT INTO my_audit_table  (col1, col2, ...)
     SELECT col1, col2...
     FROM DELETED 
Run Code Online (Sandbox Code Playgroud)

会发生什么情况,当从表中删除记录(或记录!)时,将删除已删除的行my_audit_table.DELETED表是一个虚拟表,其中包含删除之前的记录.

另请注意,触发器作为delete语句中隐式事务的一部分运行,因此如果删除失败并回滚,则触发器也将回滚.


Ari*_*ion 14

你也可以用 INSTEAD OF DELETE

CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN

     -- Some code you want to do before delete

     DELETE YourTable
     FROM DELETED D
     INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
Run Code Online (Sandbox Code Playgroud)

  • INSTEAD OF DELETE无法使用,因为我在表上启用了删除级联. (10认同)
  • FWIW,您可以将所有级联删除外键更改为普通外键并处理此触发器中的删除,这样可以在一个位置清除由于删除而发生的所有事情. (4认同)