web-dev-qa-db-fra.com

Comment créer un déclencheur avant suppression dans SQL Server?

Je veux créer un déclencheur avant suppression. Lorsque je supprime un enregistrement d'une table, cet enregistrement doit être inséré dans une table d'historique. Comment puis-je faire cela dans SQL Server?

22
user1374263

Dans cette situation, il est probablement préférable de faire un déclencheur régulier «après». C'est l'approche la plus courante pour ce type de situation. 

Quelque chose comme 

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

Ce qui se passera est que, lorsqu'un enregistrement (ou des enregistrements!) Est supprimé de votre table, la ligne supprimée est insérée dans my_audit_table. La table DELETED est une table virtuelle contenant les enregistrements tels qu'ils étaient juste avant la suppression.

Notez également que le déclencheur s'exécute dans le cadre de la transaction implicite sur l'instruction de suppression. Par conséquent, si votre suppression échoue et est annulée, le déclencheur est également annulé. 

32
Code Magician

Vous pouvez également utiliser 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
12
Arion

Cela pourrait être fait en suivant les étapes pour, disons, dans cet exemple, j’utilise la table client:

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. Créer une histoire:

    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. Déclenchez sur la table source comme ci-dessous lors de l'événement 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
    
1
Deepesh Tiwari