28

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

4

4 回答 4

37

在这种情况下,您最好进行常规的“后”触发。这是处理此类情况的最常见方法。

就像是

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

将会发生的情况是,当从表中删除一条记录(或多条记录!)时,删除的行将插入到my_audit_tableDELETED表是一个虚拟表,其中包含删除前的记录。

另外,请注意触发器作为删除语句上隐式事务的一部分运行,因此如果您的删除失败并回滚,触发器也会回滚。

于 2012-05-04T06:34:14.447 回答
16

你也可以使用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
于 2012-05-04T06:36:06.167 回答
1

可以通过以下步骤完成,例如在此示例中我使用的是客户表:

CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   LAST_UPDATED DATETIME,
   PRIMARY KEY (ID)
);
  1. 创建历史:

    CREATE TABLE CUSTOMERS_HIST( 
    ID   INT              NOT NULL,
    NAME VARCHAR (20)     NOT NULL,
    AGE  INT              NOT NULL,
    ADDRESS  CHAR (25) ,
    LAST_UPDATED DATETIME,
    PRIMARY KEY (ID)
    );
    
  2. 在删除事件上触发源表,如下所示:

    CREATE TRIGGER TRG_CUSTOMERS_DEL 
    ON CUSTOMERS
    FOR DELETE
    AS
         INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED)
         SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED
         FROM DELETED
    
于 2015-10-28T09:14:27.010 回答
0

尝试在删除之前执行的触发器,并在不满足条件时抛出错误。

CREATE TRIGGER [dbo].[TableName_PreventDeleteAndUpdate]
ON dbo.TableName
FOR DELETE, UPDATE -- runs before deletes and updates
AS
BEGIN
    IF (APP_NAME() <> 'SomeApp')
    BEGIN
        RAISERROR ('Only delete/update with SomeApp', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN;
    END
END
于 2022-01-31T08:44:27.687 回答