PG事件触发器监控DDL
学习使用事件触发器捕获和响应数据库DDL操作 · 难度:入门 · +15XP
事件触发器概念
事件触发器(Event Trigger)在DDL事件发生时触发,如CREATE TABLE、ALTER TABLE、DROP TABLE等,与普通触发器不同,它不绑定到特定表。
创建事件触发器函数
CREATE OR REPLACE FUNCTION log_ddl()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE 'DDL操作: %, 对象: %',
tg_tag,
object_identity;
END;
$$ LANGUAGE plpgsql;创建事件触发器
CREATE EVENT TRIGGER log_ddl_trigger
ON ddl_command_start
EXECUTE FUNCTION log_ddl();
-- 测试触发器
CREATE TABLE test_ddl (id INT);
事件类型
| 事件类型 | 触发时机 |
|---|---|
| ddl_command_start | DDL执行前 |
| ddl_command_end | DDL执行后 |
| sql_drop | 对象被删除时 |
| table_rewrite | 表被重写时 |
实际应用
-- 防止删除重要表
CREATE OR REPLACE FUNCTION prevent_drop()
RETURNS event_trigger AS $$
DECLARE
obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
LOOP
IF obj.object_type = 'table' AND obj.object_name LIKE 'important%' THEN
RAISE EXCEPTION '不允许删除重要表: %', obj.object_name;
END IF;
END LOOP;
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER prevent_drop_trigger
ON sql_drop
EXECUTE FUNCTION prevent_drop();
练习提示
创建一个事件触发器,记录所有DDL操作到审计表,尝试创建、修改和删除表。