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

SELECT * FROM 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ả

SELECT * FROM log_table;

Tóm Tắt

  1. Tạo hàm trigger với cú pháp phù hợp.
  2. Tạo trigger liên kết với hàm và chỉ định sự kiện.
  3. Thực hiện các thao tác trên bảng để kích hoạt trigger.
  4. 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.