事件触发器

触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。

语法格式

  • 创建事件触发器。

    1. CREATE EVENT TRIGGER name
    2. ON event
    3. [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]
    4. EXECUTE PROCEDURE function_name()
  • 修改事件触发器。

    1. ALTER EVENT TRIGGER name DISABLE
    2. ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ]
    3. ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    4. ALTER EVENT TRIGGER name RENAME TO new_name
  • 删除事件触发器。

    1. DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ];

参数说明

  • name

    事件触发器名称。

  • filter_variable

    事件触发器用来做过滤的变量(目前仅支持TAG)。

  • event

    事件触发器支持的事件,目前支持ddl_command_start、ddl_command_end、sql_drop、table_rewrite。

  • function_name

    用户定义的函数,必须声明为不带参数并返回类型为event_trigger,在事件触发器触发时执行。

  • new_name

    修改后的新事件触发器名称。

  • disable

    禁用该事件触发器。

  • ENABLE [ REPLICA | ALWAYS ]

    该事件触发器在session_replication_role为REPLICA\任何取值时可用。

示例

  1. --创建事件触发器函数(用于ddl_command_startddl_command_end事件)
  2. openGauss=# create function test_event_trigger() returns event_trigger as $$
  3. BEGIN
  4. RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag;
  5. END
  6. $$ language plpgsql;
  7. --创建事件触发器函数(用于sql_drop事件)
  8. openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command()
  9. RETURNS event_trigger AS $$
  10. BEGIN
  11. RAISE NOTICE '% - sql_drop', tg_tag;
  12. END;
  13. $$ LANGUAGE plpgsql;
  14. --创建事件触发器函数(用于table_rewrite事件)
  15. openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
  16. LANGUAGE plpgsql AS $$
  17. BEGIN
  18. RAISE EXCEPTION 'rewrites not allowed';
  19. END;
  20. $$;
  21. --创建事件类型为ddl_command_start的事件触发器
  22. openGauss=# create event trigger regress_event_trigger on ddl_command_start
  23. execute procedure test_event_trigger();
  24. --创建事件类型为ddl_command_end的事件触发器
  25. openGauss=# create event trigger regress_event_trigger_end on ddl_command_end
  26. execute procedure test_event_trigger();
  27. --创建事件类型为sql_drop的事件触发器
  28. openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_drop
  29. EXECUTE PROCEDURE drop_sql_command();
  30. --创建事件类型为table_rewrite的事件触发器
  31. openGauss=# create event trigger no_rewrite_allowed on table_rewrite
  32. when tag in ('alter table') execute procedure test_evtrig_no_rewrite();
  33. --执行ddl语句查看事件触发器效果(触发ddl_command_startddl_command_end)
  34. openGauss=# create table event_trigger_table (a int);
  35. --执行alter table语句查看事件触发器效果(触发ddl_command_starttable_rewrite,ddl_command_end由于禁止rewrite报错不触发)
  36. openGauss=# alter table event_trigger_table alter column a type numeric;
  37. --执行drop语句查看事件触发器效果(触发ddl_command_startsql_dropddl_command_end)
  38. openGauss=# drop table event_trigger_table;
  39. --修改事件触发器
  40. openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123';
  41. openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start;
  42. --应该失败,事件触发器的owner只能为超级用户
  43. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user;
  44. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable;
  45. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always;
  46. --删除事件触发器
  47. openGauss=# DROP EVENT TRIGGER regress_event_trigger_start;
  48. openGauss=# DROP EVENT TRIGGER regress_event_trigger_end;
  49. openGauss=# DROP EVENT TRIGGER sql_drop_command;
  50. openGauss=# DROP EVENT TRIGGER no_rewrite_allowed;