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-matrix 说 ddl_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();
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-matrix 说 ddl_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();