Trong PostgreSQL, trigger là một cơ chế cho phép thực thi một hàm (function) tự động khi có các sự kiện cụ thể xảy ra trong một bảng, chẳng hạn như INSERT, UPDATE, hoặc DELETE. Dưới đây là hướng dẫn từng bước để thiết lập trigger, bao gồm cả ví dụ cơ bản và nâng cao.
Bước 1: Tạo Hàm Trigger
Trước tiên, bạn cần tạo một hàm sẽ được gọi khi trigger kích hoạt. Hàm này thường trả về kiểu TRIGGER
.
Ví dụ 1: Hàm Trigger Cơ Bản
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO log_table (action, log_time)
VALUES ('Inserted', NOW());
RETURN NEW; -- Trả về bản ghi mới
END;
$$ LANGUAGE plpgsql;
Bước 2: Tạo Trigger
Sau khi đã có hàm, bạn cần tạo trigger và chỉ định hàm nào sẽ được gọi khi trigger kích hoạt.
Ví dụ 2: Trigger Cơ Bản
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON your_table -- Tên bảng mà bạn muốn gán trigger
FOR EACH ROW
EXECUTE FUNCTION log_insert();
Ví dụ Minh Họa Từ Cơ Bản Đến Nâng Cao
Giả sử bạn có một bảng employees
và bạn muốn ghi lại các hành động chèn mới vào một bảng log_table
.
Tạo Các Bảng Cần Thiết
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(100)
);
CREATE TABLE log_table (
id SERIAL PRIMARY KEY,
action VARCHAR(50),
log_time TIMESTAMP
);
1. Tạo Hàm Trigger
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO log_table (action, log_time)
VALUES ('Inserted employee: ' || NEW.name, NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
2. Tạo Trigger
CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
EXECUTE FUNCTION log_insert();
3. Thêm Dữ Liệu vào Bảng employees
INSERT INTO employees (name, position) VALUES ('Alice', 'Developer');
INSERT INTO employees (name, position) VALUES ('Bob', 'Manager');
4. Kiểm Tra Kết Quả Trong Bảng log_table
Ví dụ Nâng Cao: Trigger Cho Cập Nhật và Xóa
Bạn có thể tạo trigger cho nhiều sự kiện khác nhau, chẳng hạn như cập nhật và xóa.
Tạo Hàm Nâng Cao
CREATE OR REPLACE FUNCTION log_update_delete()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'UPDATE' THEN
INSERT INTO log_table (action, log_time)
VALUES ('Updated employee: ' || NEW.name, NOW());
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO log_table (action, log_time)
VALUES ('Deleted employee: ' || OLD.name, NOW());
END IF;
RETURN NEW; -- Đối với UPDATE, trả về NEW; Đối với DELETE, trả về OLD
END;
$$ LANGUAGE plpgsql;
Tạo Trigger Nâng Cao
CREATE TRIGGER after_employee_update_delete
AFTER UPDATE OR DELETE ON employees
FOR EACH ROW
EXECUTE FUNCTION log_update_delete();
Sử Dụng Trigger
Giờ đây, khi bạn cập nhật hoặc xóa một bản ghi trong bảng employees
, trigger sẽ tự động ghi lại hành động đó vào bảng log_table
.
Cập Nhật và Xóa Dữ Liệu
UPDATE employees SET position = 'Senior Developer' WHERE name = 'Alice';
DELETE FROM employees WHERE name = 'Bob';
Kiểm Tra Kết Quả
Tóm Tắt
- Tạo hàm trigger với cú pháp phù hợp.
- Tạo trigger liên kết với hàm và chỉ định sự kiện.
- Thực hiện các thao tác trên bảng để kích hoạt trigger.
- Kiểm tra kết quả trong bảng log hoặc bảng liên quan.
Trigger là công cụ mạnh mẽ để tự động hóa quy trình và theo dõi hành động trên cơ sở dữ liệu, giúp bạn duy trì tính toàn vẹn dữ liệu và ghi lại lịch sử thay đổi.