2010-06-03 59 views
20

Tôi muốn sử dụng trình kích hoạt trên bàn sẽ được kích hoạt mỗi lần chèn hàng, cập nhật hoặc xóa.ORACLE và TRIGGERS (chèn, cập nhật, đã xóa)

tôi đã viết một cái gì đó như thế này:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR DELETE OR UPDATE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00') 

và nó hoạt động. Vì tôi muốn làm những việc tương tự nếu hàng được chèn, cập nhật hoặc xóa, tôi muốn biết điều gì đang xảy ra trong trình kích hoạt. Tôi nghĩ rằng tôi có thể quản lý để tìm nếu hàng được chèn hoặc cập nhật (tôi có thể kiểm tra old_buffer với new_buffer). Làm cách nào để biết hàng đã bị xóa?

Trả lời

36

Từ Using Triggers:

Phát hiện các hoạt động DML Đó Fired một Trigger

Nếu có nhiều hơn một loại DML hoạt động có thể bắn một kích hoạt (ví dụ, ON chèn hoặc xóa hoặc cập nhật OF Emp_tab), trình kích hoạt có thể sử dụng các biến vị ngữ có điều kiện INSERTING, XÓA, và CẬP NHẬT để kiểm tra xem loại tuyên bố nào kích hoạt loại .

Vì vậy

IF DELETING THEN ... END IF; 

nên làm việc đối với trường hợp của bạn.

+2

Cảm ơn câu trả lời của bạn. Nó hoạt động. Tôi có một số vấn đề với DELETING. Tôi đoán nó không bị mắc kẹt nguyên nhân của tình trạng này new_buffer.field1 = 'HBP00'. – LeftyX

1

Phân tách thành 2 trình kích hoạt. Một cho xóa và một cho chèn \ cập nhật.

+0

Cảm ơn, nhưng tôi muốn biết làm thế nào để xác định các hoạt động. Alberto – LeftyX

+1

@LeftyX Đó là lý do tại sao bạn nên chấp nhận câu trả lời của devio, chứ không phải Tony Andrews. – pauloya

4

Giá trị MỚI (hoặc NEW_BUFFER như bạn đã đổi tên) chỉ có sẵn khi INSERTING và UPDATING. Đối với DELETING, bạn sẽ cần sử dụng OLD (OLD_BUFFER). Vì vậy, kích hoạt của bạn sẽ trở thành:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR DELETE OR UPDATE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

Bạn có thể cần phải thêm logic bên trong trình kích hoạt để phục vụ cho mã cập nhật field1 từ 'HBP000' sang nội dung khác.

+0

Tôi đã tìm ra nó 10 phút trước ;-) Cảm ơn. Alberto – LeftyX

18

Tôi đã thay đổi mã của tôi như thế này và nó hoạt động:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR UPDATE OR DELETE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

DECLARE 
     Operation  NUMBER; 
     CustomerCode CHAR(10 BYTE); 
BEGIN 

IF DELETING THEN 
    Operation := 3; 
    CustomerCode := :old_buffer.field1; 
END IF; 

IF INSERTING THEN 
    Operation := 1; 
    CustomerCode := :new_buffer.field1; 
END IF; 

IF UPDATING THEN 
    Operation := 2; 
    CustomerCode := :new_buffer.field1; 
END IF;  

// DO SOMETHING ... 

EXCEPTION 
    WHEN OTHERS THEN ErrorCode := SQLCODE; 

END; 
Các vấn đề liên quan