Я хочу создать триггер before delete. Когда я удаляю запись из таблицы, запись которой должна быть вставлена в таблицу истории. Как это сделать в SQL Server?
Как создать триггер до удаления в SQL Server?
Ответ 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