Подтвердить что ты не робот

Как создать триггер до удаления в SQL Server?

Я хочу создать триггер before delete. Когда я удаляю запись из таблицы, запись которой должна быть вставлена ​​в таблицу истории. Как это сделать в SQL Server?

4b9b3361

Ответ 1

В этой ситуации вам, вероятно, лучше делать регулярный триггер "после". Это наиболее распространенный подход к этому типу ситуации.

Что-то вроде

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

Что произойдет, когда запись (или записи!) будет удалена из вашей таблицы, удаленная строка будет вставлена ​​в my_audit_table Таблица DELETED - это виртуальная таблица, содержащая запись (записи), поскольку они были непосредственно перед удалением.

Также обратите внимание, что триггер запускается как часть неявной транзакции в инструкции delete, поэтому, если ваше удаление завершится неудачей и откат, триггер также откатится.

Ответ 2

Вы также можете использовать 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

Ответ 3

Это можно сделать в следующих шагах, чтобы в этом примере можно сказать, что я использую таблицу клиентов:

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)
);
  • Создать историю:

    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)
    );
    
  • Триггер в исходной таблице, как показано ниже, в событии delete:

    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