跳到主要内容

触发器函数

触发器函数不是普通的 SELECT fn(...):它声明 RETURNS trigger,由表上的触发器在指定事件发生时调用。以下示例在更新行前维护修改时间。

CREATE FUNCTION touch_updated_at() RETURNS trigger
LANGUAGE plpgsql AS $$
BEGIN
NEW.updated_at := current_timestamp;
RETURN NEW;
END;
$$;

CREATE TRIGGER orders_touch_updated_at
BEFORE UPDATE ON orders
FOR EACH ROW EXECUTE FUNCTION touch_updated_at();

前提是 orders 有 updated_at 列。函数和触发器定义只需执行一次;迁移时应管理重复创建与回滚。

行级上下文和返回值​

NEW 表示新行(INSERT、UPDATE),OLD 表示旧行(UPDATE、DELETE);TG_OP 给出操作名称,TG_TABLE_NAME 给出表名,TG_ARGV 访问触发器参数。BEFORE 行级触发器返回 NEW 可继续写入修改后的行,返回 NULL 会跳过该行操作;DELETE 通常返回 OLD。AFTER 行级触发器的返回值会被忽略。INSTEAD OF 触发器可用于视图,但返回语义和适用事件要单独确认。

语句级触发器与风险​

FOR EACH STATEMENT 每条语句调用一次,即使影响零行;它没有单行 NEW/OLD。需要一次处理多行时可考虑过渡表。触发器的写入与原语句同事务,报错会令语句失败;额外写表可能引发递归、锁竞争或难以发现的性能成本。不要依赖触发器发生顺序实现隐含业务流程,检查重复更新、批量导入及权限边界。