CREATE TRIGGER

功能描述

创建一个事件触发器,在指定事件发生发生时执行指定的事件触发器函数。

注意事项

  • 只有超级用户或系统管理员才有权限创建事件触发器。
  • 如果为同一事件定义了多个相同类型的事件触发器,则按事件触发器的名称字母顺序触发它们。
  • 事件触发器会对ddl操作的性能有一定影响。取决于事件触发器的数量还执行函数的复杂程度。

语法格式

1. CREATE EVENT TRIGGER name
2. ON event
3. [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]
4. EXECUTE PROCEDURE function_name()

参数说明

  • name

事件触发器名称。 - filter_variable

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

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

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

示例

1. --创建事件触发器函数(用于ddl_command_start、ddl_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;

8. --创建事件触发器函数(用于sql_drop事件)
9. openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command()
10. RETURNS event_trigger AS $$
11. BEGIN
12. RAISE NOTICE '% - sql_drop', tg_tag;
13. END;
14. $$ LANGUAGE plpgsql;

16. --创建事件触发器函数(用于table_rewrite事件)
17. openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
18. LANGUAGE plpgsql AS $$
19. BEGIN
20. RAISE EXCEPTION 'rewrites not allowed';
21. END;
22. $$;

24. --创建事件类型为ddl_command_start的事件触发器
25. openGauss=# create event trigger regress_event_trigger on ddl_command_start
26. execute procedure test_event_trigger();

28. --创建事件类型为ddl_command_end的事件触发器
29. openGauss=# create event trigger regress_event_trigger_end on ddl_command_end
30. execute procedure test_event_trigger();

32. --创建事件类型为sql_drop的事件触发器
33. openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_drop
34. EXECUTE PROCEDURE drop_sql_command();

36. --创建事件类型为table_rewrite的事件触发器
37. openGauss=# create event trigger no_rewrite_allowed on table_rewrite
38. when tag in ('alter table') execute procedure test_evtrig_no_rewrite();

40. --修改事件触发器
41. openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123';
42. openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start;
43. --应该失败,事件触发器的owner只能为超级用户
44. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user;
45. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable;
46. openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always;

48. --删除触发器
49. openGauss=# DROP EVENT TRIGGER regress_event_trigger_start;
50. openGauss=# DROP EVENT TRIGGER regress_event_trigger_end;
51. openGauss=# DROP EVENT TRIGGER sql_drop_command;
52. openGauss=# DROP EVENT TRIGGER no_rewrite_allowed;

相关链接

ALTER EVENT TRIGGER,DROP EVENT TRIGGER