Trong oracle có hai cấp độ kích hoạt:cấp độ hàng và cấp độ bảng.
Trình kích hoạt mức hàng được thực thi for each row
. Trình kích hoạt cấp bảng được thực thi trên mỗi câu lệnh, ngay cả khi một câu lệnh thay đổi nhiều hơn một hàng.
Trong trình kích hoạt cấp hàng, bạn không thể chọn / cập nhật chính bảng có trình kích hoạt:bạn sẽ gặp lỗi thay đổi.
Trong trường hợp này, không cần câu lệnh CẬP NHẬT. Chỉ cần thử cái này:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
CHỈNH SỬA Rajesh đã đề cập có thể xảy ra rằng trước khi chèn một hàng mới, OP muốn cập nhật tất cả các bản ghi khác trong aso_quote_headers_all
bảng.
Chà, điều này là khả thi, nhưng nó hơi phức tạp. Để làm điều này đúng cách, bạn sẽ cần
- Gói pl / sql và một biến trong tiêu đề gói được trình kích hoạt sửa đổi. Biến này có thể là một danh sách chứa ID của các bản ghi mới được chèn vào. Cấp hàng sau khi chèn trình kích hoạt sẽ thêm một ID mới vào danh sách. Nội dung của biến gói này sẽ khác nhau đối với mỗi phiên khác nhau, vì vậy hãy gọi biến này là
session_variable
. - Cấp hàng sau khi chèn trình kích hoạt, sẽ thêm ID mới vào
session_variable
. - Cấp bảng sau khi chèn trình kích hoạt sẽ nhận ID từ
session_variable
, xử lý ID và sau đó xóa nó khỏisession_variable
. Trình kích hoạt này có thể thực hiện các lựa chọn / cập nhật cần thiết trên aso_quote_headers_all. Sau khi một ID mới chèn được xử lý, trình kích hoạt này phải đảm bảo rằng nó được xóa khỏisession_variable
.