web-dev-qa-db-ja.com

SQL Serverで削除前トリガーを作成する方法は?

削除前トリガーを作成したい。テーブルからレコードを削除するとき、そのレコードは履歴テーブルに挿入する必要があります。 SQL Serverでこれを行うにはどうすればよいですか?

23
user1374263

この状況では、通常の「後」トリガーを実行する方が良いでしょう。これは、このタイプの状況に対する最も一般的なアプローチです。

何かのようなもの

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テーブルは、レコードを含む仮想テーブルです。削除の直前であったため。

また、トリガーは削除ステートメントの暗黙的なトランザクションの一部として実行されるため、削除が失敗してロールバックした場合、トリガーもロールバックされることに注意してください。

32
Code Magician

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
13
Arion

次の手順で行うことができます。この例では、顧客テーブルを使用しています。

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
    
1
Deepesh Tiwari