2012-05-04 17 views

risposta

29

In questa situazione, è probabilmente meglio fare un trigger regolare "dopo". Questo è l'approccio più comune a questo tipo di situazione.

Qualcosa di simile

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

Quello che accadrà è, quando un record (o record!) Vengono eliminati dal tavolo, la riga eliminata sarà inserito nel my_audit_table La DELETED tabella è una tabella virtuale che contiene il record (s) come erano immediatamente prima dell'eliminazione.

Inoltre, si noti che il trigger viene eseguito come parte della transazione implicita sull'istruzione delete, quindi se l'eliminazione fallisce e si ripristina, anche il trigger arretra.

+0

Grazie per la risposta, funziona benissimo – user1374263

+1

Notando che per il rollback di lavorare su un errore che un blocco try/catch può essere necessaria entro il trigger [(esempio)] (http://dba.stackexchange.com/questions/57909) dipende probabilmente da ciò che causa l'errore. – crokusek

+1

Un buon punto, ma ricorda che si applica solo a RAISEERROR. Un errore di chiusura regolare dell'istruzione (ad esempio violazione di PK, ecc.) Comporterà il rollback della transazione implicita con inizio all'esterno del trigger. –

10

Si potrebbe anche usare 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 
+8

INSTEAD OF DELETE non può essere utilizzato poiché ho eliminato la cascata abilitata sulla tabella. – user1374263

+2

FWIW, è possibile modificare tutte le chiavi esterne di eliminazione in cascata su semplici chiavi esterne ed elaborare le eliminazioni dall'interno di questo trigger, che renderebbe chiaro in un punto tutto ciò che stava accadendo in seguito all'eliminazione. – Tony

0

Potrebbe essere fatto in seguito passaggi per la diciamo in questo esempio sto usando tavolo del cliente:

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. creare la storia:

    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. Trigger su tabella di origine come qui di seguito in caso di eliminazione:

    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 
    
Problemi correlati