跳到主要内容

事件触发器函数

普通触发器响应表数据变化;事件触发器响应数据库级 DDL 事件,例如创建、修改或删除对象,常用于审计和策略检查。函数声明 RETURNS event_trigger,只能由事件触发器调用,配置需要相应高级权限。

基本形式​

CREATE FUNCTION log_ddl_start() RETURNS event_trigger
LANGUAGE plpgsql AS $$
BEGIN
RAISE LOG 'DDL command: %', TG_TAG;
END;
$$;

CREATE EVENT TRIGGER log_ddl_start_event
ON ddl_command_start EXECUTE FUNCTION log_ddl_start();

TG_EVENT 是事件名称,TG_TAG 是命令标签;这两个上下文变量只在事件触发器函数中有意义。示例会对相应 DDL 记录服务器日志,部署前应评估日志量。

事件与辅助函数​

ddl_command_start 在执行 DDL 前触发,适合阻止不允许的命令;ddl_command_end 在 DDL 完成后触发,可通过 pg_event_trigger_ddl_commands() 读取本次 DDL 的对象信息。sql_drop 可通过 pg_event_trigger_dropped_objects() 读取将被删除或级联删除的对象。table_rewrite 可通过 pg_event_trigger_table_rewrite_oid() 和 pg_event_trigger_table_rewrite_reason() 获取重写表及原因。上述辅助函数必须在对应事件上下文中调用,不是普通会话随意查询的历史记录接口。

安全边界​

事件触发器并不覆盖所有命令(例如共享对象和部分特殊 DDL);不要把它当成完整审计系统。函数失败可能使 DDL 失败,错误的事件触发器还可能阻碍后续迁移。部署前用测试库验证事件覆盖、级联删除、回滚和应急禁用流程,避免把普通应用角色赋予创建事件触发器的权限。