⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

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_startDDL执行前
ddl_command_endDDL执行后
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操作到审计表,尝试创建、修改和删除表。

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 131 篇
0 完成
🔥 0