- Stored procedure: một khối code (SQL + logic thủ tục như PL/pgSQL) lưu và chạy bên trong DB, gọi theo tên (
CALL proc(...)). Gói nhiều câu lệnh thành một đơn vị chạy sát dữ liệu. - Trigger: code tự động chạy khi có sự kiện trên bảng (
BEFORE/AFTERINSERT/UPDATE/DELETE). Dùng cho audit log, cập nhật cột phái sinh, ép ràng buộc phức tạp.
Phân biệt procedure với function: function trả về giá trị và gọi được bên trong câu SQL (SELECT my_func(x)); procedure gọi bằng CALL, và trong PostgreSQL có thể tự COMMIT/ROLLBACK giữa chừng — điều function không làm được.
-- Trigger tự ghi audit mỗi khi lương thay đổi
CREATE TRIGGER log_salary_change
AFTER UPDATE OF salary ON employees
FOR EACH ROW
EXECUTE FUNCTION record_salary_history();Ưu:
- Chạy sát dữ liệu → giảm số round-trip mạng cho thao tác nhiều bước.
- Gom logic dùng chung, đảm bảo quy tắc áp dụng bất kể ứng dụng nào gọi.
- Trigger đảm bảo hành vi (vd ghi lịch sử) luôn xảy ra, không thể "quên".
Nhược:
- Logic nghiệp vụ nằm trong DB → khó test, khó version, khó debug hơn code ứng dụng; dễ thành "logic ẩn".
- Trigger chạy ngầm → hành vi khó lần theo, dễ gây tác dụng phụ bất ngờ và ảnh hưởng hiệu năng ghi.
- Khó scale ngang phần tính toán (DB thường là điểm nghẽn) và ràng buộc vào một loại DB.
Xu hướng hiện đại: giữ logic nghiệp vụ ở tầng ứng dụng cho dễ test/version; dùng procedure/trigger cho việc thật sự thuộc về dữ liệu (audit, toàn vẹn, thao tác lô nặng gần dữ liệu).