PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

37.4. 完整触发器示例 #

以下是使用 PL/pgSQL 维护数据表修改时间戳的经典触发器实现范例:

CREATE TABLE emp (
    empname text,
    salary integer,
    last_date timestamp,
    last_user text
);

CREATE OR REPLACE FUNCTION emp_stamp() RETURNS trigger AS $$
BEGIN
    -- 校验薪资不能为负
    IF NEW.salary < 0 THEN
        RAISE EXCEPTION '员工薪水不能为负数: %', NEW.salary;
    END IF;

    -- 自动记录最后更新时间与操作者
    NEW.last_date := current_timestamp;
    NEW.last_user := session_user;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp_trigger
BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW
EXECUTE FUNCTION emp_stamp();