2012-05-04 33 views

回答

29

在這種情況下,你可能觸發「後」更好做有規律的。這是這種情況最常見的方法。

喜歡的東西

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

會發生什麼事是,當一個記錄(或記錄!)從您的表中刪除,刪除的行會被插入到my_audit_tableDELETED表是包含一個虛擬表在刪除前立即記錄。

另外請注意,觸發運行作爲delete語句隱含的交易的一部分,因此,如果您刪除失敗並回滾,觸發也將回滾。

+0

感謝您的答覆,它工作正常 – user1374263

+1

注意到,對於回滾到上一個錯誤,一個try/catch塊可在需要工作觸發器[(示例)](http://dba.stackexchange.com/questions/57909)可能取決於導致錯誤的原因。 – crokusek

+1

好點,但請記住,只適用於RAISEERROR。常規語句終止錯誤(例如,PK違例等)將導致隱式事務的回滾從觸發器之外開始。 –

10

你也可以使用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,因爲我有級聯刪除無法使用啓用。 – user1374263

+2

FWIW,你可以改變所有的級聯刪除外鍵爲普通外鍵和處理來自該觸發器中的刪除,這將使它在發生的事情作爲刪除的結果產生一個地方都清楚了。 – Tony

0

這是可以做到在下面的步驟進行,讓我們在這個例子說,我使用的客戶表:

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