PostgreSQL - TRIGGERS
PostgreSQL Triggers là các hàm gọi lại cơ sở dữ liệu, được tự động thực hiện / gọi khi một sự kiện cơ sở dữ liệu cụ thể xảy ra.
Sau đây là những điểm quan trọng về trình kích hoạt PostgreSQL:
Trình kích hoạt PostgreSQL có thể được chỉ định để kích hoạt
Trước khi thực hiện thao tác trên một hàng (trước khi các ràng buộc được kiểm tra và thực hiện CHÈN, CẬP NHẬT hoặc XÓA)
Sau khi hoạt động hoàn tất (sau khi các ràng buộc được kiểm tra và CHÈN, CẬP NHẬT hoặc XÓA đã hoàn thành)
Thay vì thao tác (trong trường hợp chèn, cập nhật hoặc xóa trên một dạng xem)
Một trình kích hoạt được đánh dấu CHO TỪNG ROW được gọi một lần cho mỗi hàng mà thao tác sửa đổi. Ngược lại, trình kích hoạt được đánh dấu CHO TỪNG TRẠNG THÁI chỉ thực thi một lần cho bất kỳ hoạt động nhất định nào, bất kể nó sửa đổi bao nhiêu hàng.
Cả hai, mệnh đề WHEN và các hành động kích hoạt, có thể truy cập các phần tử của hàng đang được chèn, xóa hoặc cập nhật bằng cách sử dụng các tham chiếu của biểu mẫu NEW.column-name và OLD.column-name, trong đó tên-cột là tên của một cột từ bảng mà trình kích hoạt được liên kết với.
Nếu mệnh đề WHEN được cung cấp, các câu lệnh PostgreSQL được chỉ định chỉ được thực thi cho các hàng mà mệnh đề WHEN là đúng. Nếu không cung cấp mệnh đề WHEN, các câu lệnh PostgreSQL được thực thi cho tất cả các hàng.
Nếu nhiều trình kích hoạt cùng loại được xác định cho cùng một sự kiện, chúng sẽ được kích hoạt theo thứ tự bảng chữ cái theo tên.
Từ khóa BEFORE, AFTER hoặc INSTEAD OF xác định khi nào các hành động kích hoạt sẽ được thực hiện liên quan đến việc chèn, sửa đổi hoặc loại bỏ hàng được liên kết.
Các trình kích hoạt sẽ tự động bị loại bỏ khi bảng liên kết với chúng bị loại bỏ.
Bảng được sửa đổi phải tồn tại trong cùng cơ sở dữ liệu với bảng hoặc dạng xem mà trình kích hoạt được đính kèm và người ta phải sử dụng tablename, không phải database.tablename.
Tùy chọn CONSTRAINT khi được chỉ định sẽ tạo ra một trình kích hoạt ràng buộc . Điều này giống với một trình kích hoạt thông thường ngoại trừ việc có thể điều chỉnh thời gian kích hoạt của trình kích hoạt bằng cách sử dụng SET CONSTRAINTS. Các trình kích hoạt ràng buộc dự kiến sẽ tạo ra một ngoại lệ khi các ràng buộc mà chúng triển khai bị vi phạm.
Cú pháp
Cú pháp cơ bản của việc tạo trigger như sau -
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
Đây, event_namecó thể là INSERT, DELETE, UPDATE và TRUNCATE hoạt động cơ sở dữ liệu trên bảng được đề cậptable_name. Bạn có thể tùy chọn chỉ định CHO TỪNG ROW sau tên bảng.
Sau đây là cú pháp tạo trình kích hoạt trên thao tác CẬP NHẬT trên một hoặc nhiều cột được chỉ định của bảng như sau:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
-- Trigger logic goes here....
];
Thí dụ
Chúng ta hãy xem xét một trường hợp chúng ta muốn tiếp tục kiểm tra thử cho mọi bản ghi đang được chèn vào bảng COMPANY, mà chúng ta sẽ tạo mới như sau (Bỏ bảng COMPANY nếu bạn đã có).
testdb=# CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Để tiếp tục thử nghiệm kiểm tra, chúng tôi sẽ tạo một bảng mới có tên AUDIT nơi các thông báo nhật ký sẽ được chèn vào bất cứ khi nào có mục nhập trong bảng COMPANY cho một bản ghi mới -
testdb=# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
Ở đây, ID là ID bản ghi AUDIT và EMP_ID là ID, sẽ đến từ bảng COMPANY và DATE sẽ giữ dấu thời gian khi bản ghi sẽ được tạo trong bảng COMPANY. Vì vậy, bây giờ, chúng ta hãy tạo một trình kích hoạt trên bảng COMPANY như sau:
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
Trong đó Audlogfunc () là một PostgreSQL procedure và có định nghĩa sau:
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql;
Bây giờ, chúng ta sẽ bắt đầu công việc thực tế. Hãy để chúng tôi bắt đầu chèn bản ghi vào bảng COMPANY, điều này sẽ dẫn đến việc tạo bản ghi nhật ký kiểm toán trong bảng AUDIT. Vì vậy, chúng ta hãy tạo một bản ghi trong bảng COMPANY như sau:
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
Thao tác này sẽ tạo một bản ghi trong bảng COMPANY, như sau:
id | name | age | address | salary
----+------+-----+--------------+--------
1 | Paul | 32 | California | 20000
Đồng thời, một bản ghi sẽ được tạo trong bảng AUDIT. Bản ghi này là kết quả của một trình kích hoạt, mà chúng tôi đã tạo trên thao tác INSERT trên bảng COMPANY. Tương tự, bạn có thể tạo trình kích hoạt của mình trên các thao tác CẬP NHẬT và XÓA dựa trên yêu cầu của bạn.
emp_id | entry_date
--------+-------------------------------
1 | 2013-05-05 15:49:59.968+05:30
(1 row)
Danh sách TRIGGERS
Bạn có thể liệt kê tất cả các trình kích hoạt trong cơ sở dữ liệu hiện tại từ pg_trigger bảng như sau -
testdb=# SELECT * FROM pg_trigger;
Câu lệnh PostgreSQL đã cho ở trên sẽ liệt kê tất cả các trình kích hoạt.
Nếu bạn muốn liệt kê các trình kích hoạt trên một bảng cụ thể, thì hãy sử dụng mệnh đề AND với tên bảng như sau:
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
Câu lệnh PostgreSQL đã cho ở trên cũng sẽ chỉ liệt kê một mục nhập như sau:
tgname
-----------------
example_trigger
(1 row)
Đang bỏ TRIGGERS
Sau đây là lệnh DROP, có thể được sử dụng để thả một trình kích hoạt hiện có -
testdb=# DROP TRIGGER trigger_name;