2009-07-09 22 views
5

Trình kích hoạt sau khi cập nhật sẽ khởi động nếu có khôi phục?ORACLE Rollback and Trigger

Kịch bản: Cho phép nói rằng chúng tôi cập nhật bảng A và trình kích hoạt trên bảng A bắt đầu và cập nhật một bảng B khác với các chi tiết. Nếu có một rollback phát hành trên bảng A do một số lỗi xử lý, sẽ kích hoạt gây ra bảng B để rollback sự thay đổi?

Trả lời

9

Có, nó sẽ.

Triggers làm việc trong phạm vi giao dịch DML tuyên bố của (hoặc bắt đầu bởi bạn một cách rõ ràng hoặc do DML tuyên bố bản thân ngầm)

Khi giao dịch này được cuộn lại, tất cả các thay đổi do những nguyên nhân cũng được cuộn lại.

Tuy nhiên, nếu bạn đặt

PRAGMA autonomous_transaction 

vào định nghĩa kích hoạt, kích hoạt sẽ bắt đầu giao dịch riêng của mình mà bạn nên cam kết trước khi kích hoạt hoàn tất.

+1

Vì vậy, giao dịch tự quản là tốt nếu bạn muốn đăng nhập tất cả ATTEMPTS để thực hiện cập nhật (ngay cả khi chúng không thành công hoặc được khôi phục), nhưng BAD nếu bạn chỉ muốn hành động được kích hoạt thực hiện khi cập nhật kích hoạt thành công và được cam kết. Cẩn thận! –

+1

Bạn cần COMMIT rõ ràng cho các giao dịch tự quản. Nếu không, nó sẽ thất bại với "ORA-06519: giao dịch tự động đang hoạt động được phát hiện và khôi phục" – jva

+0

@jva: bạn đã đúng, đang sửa. – Quassnoi

3

Chỉ cần lưu ý - nếu bạn xác định SAU KHI kích hoạt cấp câu lệnh UPDATE (không có mệnh đề FOR ​​EACH ROW) nó sẽ không kích hoạt nếu câu lệnh DML trên bảng bị lỗi và được khôi phục.