2012-05-04 30 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