2012-05-04 17 views

Odpowiedz

29

W tej sytuacji prawdopodobnie lepiej wykonać regularne wyzwalanie "po". Jest to najbardziej powszechne podejście do tego typu sytuacji.

Coś

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

Co stanie się to, gdy rekord (lub rekordy!) Są usuwane z tabeli, usunięty wiersz zostanie wstawiony my_audit_table Stół DELETED jest stół wirtualny, który zawiera rekord (y), które były tuż przed usunięciem.

Należy również pamiętać, że wyzwalacz działa jako część niejawnej transakcji na wyciągu kasowania, więc jeśli usuwanie nie powiedzie się i wycofa, wyzwalacz również zostanie wycofany.

+0

Dzięki za odpowiedź, to działa dobrze – user1374263

+1

Stwierdzając, że dla wycofywania pracować nad błędem, że blok try/catch mogą być potrzebne w ciągu wyzwalacz [(przykład)] (http://dba.stackexchange.com/questions/57909) prawdopodobnie zależy od przyczyny błędu. – crokusek

+1

Dobrze, ale pamiętaj, że dotyczy tylko RAISEERROR. Regularny błąd zakończenia instrukcji (np. Naruszenie PK itp.) Spowoduje wycofanie transakcji niejawnej z rozpoczęciem poza wyzwalaczem. –

10

Można również użyć 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 nie może być użyty, ponieważ mam kasowanie kasowania włączone na stole. – user1374263

+2

FWIW, możesz zmienić wszystkie kaskadowe usuwanie obcych kluczy na zwykłe obce klucze i przetwarzać usunięcia z tego wyzwalacza, które w jednym miejscu usuwają wszystko, co działo się w wyniku usunięcia. – Tony

0

To może być wykonane w następujących czynności dla powiedzmy w tym przykładzie używam tabeli klientów:

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. Tworzenie Historia:

    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. Wyzwalanie tabeli źródłowej jak poniżej na Usuń wydarzenie:

    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 
    
Powiązane problemy