概述Event Trigger用于捕获DDL事件,LISTEN/NOTIFY用于应用层异步通知。结合工作进程或队列可实现审计与衍生处理,降低耦合并提升可扩展性。关键实践与参数触发范围: `ddl_command_end` 捕获DDL结束事件通知频道: `NOTIFY channel, payload`监听进程: 应用连接 `LISTEN channel`可靠性: 对重要事件使用队列与重试机制示例/配置/实现CREATE OR REPLACE FUNCTION fn_ddl_notify() RETURNS event_trigger AS $$ BEGIN PERFORM pg_notify('ddl_events', json_build_object('tag', TG_TAG, 'time', now())::text); END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER trg_ddl_notify ON ddl_command_end EXECUTE FUNCTION fn_ddl_notify(); CREATE OR REPLACE FUNCTION fn_order_notify() RETURNS trigger AS $$ BEGIN PERFORM pg_notify('order_events', json_build_object('id', NEW.id, 'op', TG_OP, 'time', now())::text); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_order_notify AFTER INSERT OR UPDATE ON orders FOR EACH ROW EXECUTE FUNCTION fn_order_notify(); // Node.js 监听 import { Client } from 'pg' const c = new Client({ connectionString: process.env.DATABASE_URL }) await c.connect() await c.query('LISTEN ddl_events') await c.query('LISTEN order_events') c.on('notification', (m) => { console.log('event', m.channel, m.payload) }) 验证事件捕获: 执行DDL与DML产生对应通知应用监听: 监听进程收到事件并记录队列集成: 对重要事件写入队列并重试处理审计: 保留事件日志与处理结果注意事项LISTEN/NOTIFY为最佳努力传递,关键事件需持久化队列事件频率高时注意连接与资源占用规范payload结构与版本安全与权限控制

发表评论 取消回复