削除前トリガーを作成したい。テーブルからレコードを削除するとき、そのレコードは履歴テーブルに挿入する必要があります。 SQL Serverでこれを行うにはどうすればよいですか?
この状況では、通常の「後」トリガーを実行する方が良いでしょう。これは、このタイプの状況に対する最も一般的なアプローチです。
何かのようなもの
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
テーブルは、レコードを含む仮想テーブルです。削除の直前であったため。
また、トリガーは削除ステートメントの暗黙的なトランザクションの一部として実行されるため、削除が失敗してロールバックした場合、トリガーもロールバックされることに注意してください。
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
次の手順で行うことができます。この例では、顧客テーブルを使用しています。
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)
);
削除イベントで以下のようなソーステーブルでトリガーします。
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