2012-05-04 26 views

Trả lời

29

Trong trường hợp này, có thể bạn nên thực hiện kích hoạt "sau" thông thường hơn. Đây là cách tiếp cận phổ biến nhất đối với loại tình huống này.

Something như

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

Điều gì sẽ xảy ra là, khi một kỷ lục (hoặc hồ sơ!) Sẽ bị xóa khỏi bảng của bạn, hàng bị xóa sẽ được chèn vào my_audit_table Các DELETED bảng là một bảng ảo chứa (các) bản ghi như chúng đã ngay trước khi xóa.

Ngoài ra, lưu ý rằng trình kích hoạt chạy như một phần của giao dịch ngầm trên lệnh xóa, vì vậy nếu xóa của bạn không thành công và quay lại, trình kích hoạt cũng sẽ quay trở lại.

+0

Cảm ơn bạn đã trả lời, nó hoạt động tốt – user1374263

+1

Ghi nhận rằng đối với rollback để làm việc trên một lỗi mà một khối try/catch có thể cần thiết trong vòng trigger [(ví dụ)] (http://dba.stackexchange.com/questions/57909) có thể phụ thuộc vào nguyên nhân gây ra lỗi. – crokusek

+1

Điểm tốt, nhưng hãy nhớ rằng chỉ áp dụng cho RAISEERROR. Lỗi kết thúc báo cáo thông thường (ví dụ: vi phạm PK, v.v.) sẽ dẫn đến việc khôi phục giao dịch ngầm với bắt đầu bên ngoài trình kích hoạt. –

10

Bạn cũng có thể sử dụng 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 không thể được sử dụng như tôi đã xóa thác được kích hoạt trên bảng. – user1374263

+2

FWIW, bạn có thể thay đổi tất cả các phím xóa các phím nước ngoài sang các khóa ngoại bằng và xử lý các xóa từ bên trong trình kích hoạt này, điều này sẽ làm cho nó rõ ràng ở một nơi mọi thứ đang xảy ra do xóa. – Tony

0

Nó có thể được thực hiện trong bước sau để giả sử trong ví dụ này tôi đang sử dụng bảng customer:

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. Tạo Lịch sử:

    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 trên bảng nguồn như dưới đây về sự kiện xóa:

    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 
    
Các vấn đề liên quan