PostgreSQL hỗ trợ nhiều loại trigger giúp bạn tự động thực thi một hành động khi có các sự kiện xảy ra trong cơ sở dữ liệu. Dưới đây là các loại trigger chính trong PostgreSQL và thời điểm nên sử dụng chúng:
1. Row-level Trigger
- Định nghĩa: Loại trigger này được kích hoạt cho mỗi hàng dữ liệu bị thay đổi (INSERT, UPDATE, DELETE).
- Thời điểm sử dụng: Khi bạn cần thực hiện một hành động cụ thể trên từng hàng của bảng, chẳng hạn như kiểm tra tính hợp lệ hoặc tự động điều chỉnh giá trị.
- Ví dụ: Tự động cập nhật trường
last_updated
khi một hàng dữ liệu được chỉnh sửa.
CREATE TRIGGER update_timestamp
BEFORE UPDATE ON employees
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();
2. Statement-level Trigger
- Định nghĩa: Kích hoạt một lần duy nhất cho mỗi câu lệnh SQL (dù câu lệnh này ảnh hưởng đến bao nhiêu hàng).
- Thời điểm sử dụng: Thích hợp khi bạn chỉ cần thực hiện một hành động trên toàn bộ bảng thay vì từng hàng, ví dụ như cập nhật bảng ghi log sau khi toàn bộ lệnh hoàn thành.
- Ví dụ: Ghi lại lịch sử truy vấn khi bảng dữ liệu bị thay đổi.
CREATE TRIGGER log_statement
AFTER INSERT ON orders
FOR EACH STATEMENT
EXECUTE FUNCTION log_new_order();
3. BEFORE Trigger
- Định nghĩa: Kích hoạt trước khi câu lệnh SQL (INSERT, UPDATE, DELETE) được thực hiện. Trigger này có thể sửa đổi hoặc từ chối việc thực hiện.
- Thời điểm sử dụng: Sử dụng khi bạn muốn xác thực hoặc thay đổi dữ liệu trước khi lưu nó vào bảng, hoặc khi muốn dừng câu lệnh nếu điều kiện không thỏa mãn.
- Ví dụ: Kiểm tra dữ liệu hợp lệ trước khi cho phép thêm vào bảng.
CREATE TRIGGER validate_data
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE FUNCTION check_employee_validity();
4. AFTER Trigger
- Định nghĩa: Kích hoạt sau khi lệnh SQL (INSERT, UPDATE, DELETE) hoàn tất, nghĩa là các thay đổi đã được thực hiện.
- Thời điểm sử dụng: Thích hợp cho các tác vụ yêu cầu dữ liệu đã được cập nhật đầy đủ, chẳng hạn như gửi thông báo hoặc đồng bộ dữ liệu sang một hệ thống khác.
- Ví dụ: Tự động gửi email khi một đơn hàng mới được tạo.
CREATE TRIGGER send_email
AFTER INSERT ON orders
FOR EACH ROW
EXECUTE FUNCTION notify_new_order();
5. INSTEAD OF Trigger
- Định nghĩa: Chỉ áp dụng cho các
VIEW
, nó thay thế hành vi mặc định của lệnh (INSERT, UPDATE, DELETE) bằng một hành động cụ thể do bạn định nghĩa.
- Thời điểm sử dụng: Khi làm việc với
VIEW
và cần quản lý các thao tác trên view mà hệ thống không hỗ trợ trực tiếp.
- Ví dụ: Thực hiện thao tác tùy chỉnh khi có người dùng cố gắng chèn dữ liệu vào một
VIEW
.
CREATE TRIGGER insert_instead
INSTEAD OF INSERT ON my_view
FOR EACH ROW
EXECUTE FUNCTION custom_insert_logic();
Khi nào nên sử dụng Trigger?
- Tự động hóa quy trình: Nếu bạn muốn tự động cập nhật một trường hoặc tính toán giá trị dựa trên thay đổi dữ liệu.
- Kiểm tra tính toàn vẹn: Khi cần đảm bảo dữ liệu tuân thủ các ràng buộc hoặc quy tắc kinh doanh trước khi cho phép thay đổi.
- Quản lý ghi log hoặc đồng bộ: Tự động lưu lại log hành động hoặc đồng bộ dữ liệu với các bảng hoặc hệ thống khác sau mỗi thay đổi.
Tuy nhiên, việc lạm dụng trigger có thể làm giảm hiệu suất vì trigger được thực thi mỗi khi có sự kiện xảy ra. Vì vậy, chỉ nên sử dụng trigger khi cần thiết và tối ưu hóa mã SQL bên trong.