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ồmNEWhàng choINSERTvàUPDATEtrình kích hoạt và / hoặcOLDhàng choUPDATEvàDELETEgâ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:
NEWLoại dữ liệu
RECORD; biến giữ hàng cơ sở dữ liệu mới choINSERT/UPDATEhoạt động trong trình kích hoạt cấp hàng. Biến này làNULLtrong trình kích hoạt cấp câu lệnh và choDELETEhoạ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ề
NULLhoặ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ạtAFTERhoặc trình kích hoạt cấp câu lệnh được kích hoạtBEFOREhoặcAFTERluô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; .