PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres kích hoạt sau khi chèn truy cập MỚI

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ồm NEW hàng cho INSERTUPDATE trình kích hoạt và / hoặc OLD hàng cho UPDATEDELETE 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 cho INSERT / 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à cho DELETE 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ì NEWOLD 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ạt AFTER hoặc trình kích hoạt cấp câu lệnh được kích hoạt BEFORE hoặc AFTER 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; .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhiều CTE trong một truy vấn

  2. GROUP BY trong Postgres - không bình đẳng cho kiểu dữ liệu JSON?

  3. Cách sử dụng EXECUTE FORMAT ... USING trong hàm postgres

  4. Những điều quan trọng cần theo dõi trong PostgreSQL - Phân tích khối lượng công việc của bạn

  5. Tên các quy trình PostgreSQL trong Windows