Từ hướng dẫn sử dụng tốt:
36.1. Tổng quan về Hành vi kích hoạt
[...]
Đối với trình kích hoạt cấp hàng, dữ liệu đầu vào cũng bao gồmNEW
hàng choINSERT
vàUPDATE
trình kích hoạt và / hoặcOLD
hàng choUPDATE
vàDELETE
gây nên. Trình kích hoạt cấp câu lệnh hiện không có bất kỳ cách nào để kiểm tra (các) hàng riêng lẻ được câu lệnh sửa đổi.
Và từ Thủ tục kích hoạt:
NEW
Loại dữ liệu
RECORD
; biến giữ hàng cơ sở dữ liệu mới choINSERT
/UPDATE
hoạt động trong trình kích hoạt cấp hàng. Biến này làNULL
trong trình kích hoạt cấp câu lệnh và choDELETE
hoạt động.
Lưu ý những gì nó nói về trình kích hoạt cấp hàng và trình kích hoạt cấp câu lệnh.
Bạn có trình kích hoạt cấp câu lệnh:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Trình kích hoạt cấp câu lệnh được kích hoạt một lần cho mỗi câu lệnh và một câu lệnh có thể áp dụng cho nhiều hàng, do đó, khái niệm về hàng bị ảnh hưởng (đó là những gì NEW
và OLD
về) đơn giản là không áp dụng.
Nếu bạn muốn sử dụng NEW
(hoặc OLD
) trong trình kích hoạt thì bạn muốn trình kích hoạt thực thi cho từng hàng bị ảnh hưởng và điều đó có nghĩa là bạn muốn trình kích hoạt cấp hàng:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Tôi vừa thay đổi FOR EACH STATEMENT
thành FOR EACH ROW
.
Trình kích hoạt của bạn cũng phải trả về một cái gì đó:
Hàm kích hoạt phải trả về
NULL
hoặc giá trị bản ghi / hàng có chính xác cấu trúc của bảng mà trình kích hoạt được kích hoạt.
[...]
Giá trị trả về của trình kích hoạt cấp hàng được kích hoạtAFTER
hoặc trình kích hoạt cấp câu lệnh được kích hoạtBEFORE
hoặcAFTER
luôn luôn bị bỏ qua; nó cũng có thể là null. Tuy nhiên, bất kỳ loại trình kích hoạt nào trong số này vẫn có thể hủy bỏ toàn bộ hoạt động do phát sinh lỗi.
Vì vậy, bạn nên RETURN NEW;
hoặc RETURN NULL;
trong trình kích hoạt của bạn. Bạn có trình kích hoạt SAU KHI SỬ DỤNG nên không quan trọng bạn sử dụng RETURN nào nhưng tôi sẽ sử dụng RETURN NEW;
.