Debian 上使用 PostgreSQL 触发器的典型场景
一 核心概念与适用范围
二 典型业务场景
三 简明示例
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_set_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_updated_at();
CREATE TABLE users_audit(
id SERIAL PRIMARY KEY,
user_id INT,
op TEXT,
old_data JSONB,
new_data JSONB,
changed_by TEXT,
changed_at TIMESTAMP DEFAULT NOW()
);
CREATE OR REPLACE FUNCTION log_user_change()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO users_audit(user_id, op, new_data, changed_by)
VALUES (NEW.id, TG_OP, row_to_json(NEW)::JSONB, current_user);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO users_audit(user_id, op, old_data, new_data, changed_by)
VALUES (NEW.id, TG_OP, row_to_json(OLD)::JSONB, row_to_json(NEW)::JSONB, current_user);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO users_audit(user_id, op, old_data, changed_by)
VALUES (OLD.id, TG_OP, row_to_json(OLD)::JSONB, current_user);
RETURN OLD;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_users_audit
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW
EXECUTE FUNCTION log_user_change();
CREATE OR REPLACE FUNCTION prevent_delete_admin()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.role = 'admin' THEN
RAISE EXCEPTION '不允许删除管理员用户';
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_prevent_delete_admin
BEFORE DELETE ON users
FOR EACH ROW
EXECUTE FUNCTION prevent_delete_admin();
上述示例覆盖了 BEFORE/AFTER、行级 触发、使用 NEW/OLD/TG_OP 等常见模式,可直接在 Debian 上的 PostgreSQL 实例中运行。
四 实践建议