pg_event_trigger_ddl_commands() 与 DROP TABLE 命令

pg_event_trigger_ddl_commands() with DROP TABLE command

CREATE OR REPLACE FUNCTION ddl_command_test()
RETURNS event_trigger
AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
        LOOP
        RAISE NOTICE '% commnad on oid: %',
                 tg_tag,
                 obj.objid;

            RAISE NOTICE 'triggered';
        END LOOP;
END; $$ LANGUAGE plpgsql;


CREATE EVENT TRIGGER test_ddl ON ddl_command_end
   EXECUTE FUNCTION ddl_command_test();

虽然 pg_event_trigger_ddl_commands() 函数 returns table 创建的信息:

CREATE TABLE test_table(
    col int
);

删除 table 时不打印通知消息:

DROP TABLE test_table;

不明白为什么,因为 event-trigger-matrix 表明 ddl_​command_​end 也包含 DROP TABLE 命令。

虽然文档 event-trigger-matrixddl_command_end 可以用于 DROP 语句,但我过去也曾为这个问题而苦恼。

因此,我找到了这个解决方法,它涉及创建一个特定的函数来获取 FROM pg_event_trigger_dropped_objects(),以便在使用 DROP 语句时发出通知。

CREATE OR REPLACE FUNCTION ddl_drop_command_test()
RETURNS event_trigger
AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
        LOOP
        RAISE NOTICE '% commnad on oid: %',
                 tg_tag,
                 obj.objid;

            RAISE NOTICE 'triggered';
        END LOOP;
END; $$ LANGUAGE plpgsql;

此外,您需要使用 ON sql_drop 创建您的事件触发器。 WHEN TAG 可以用 DROP SCHEMA 和其他 Postgres 对象递增。

CREATE EVENT TRIGGER drop_test ON sql_drop 
WHEN TAG IN ('DROP TABLE')
EXECUTE PROCEDURE ddl_drop_command_test();