Debian系统中PostgreSQL触发器的常见应用场景

DebianPostgreSQL触发器使用场景有哪些

一 核心概念与适用范围

二 典型业务场景

三 简明示例

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实例中运行。

四 实践建议

本文转载于:https://www.yisu.com/ask/61988931.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。