文章目錄
- openGauss學習筆記-43 openGauss 高級數據管理-事件觸發器
- 43.1 語法格式
- 43.2 參數說明
- 43.3 示例
openGauss學習筆記-43 openGauss 高級數據管理-事件觸發器
觸發器會在指定的ddl事件發生時自動執行函數。目前事件觸發器僅在PG兼容模式下可用。
43.1 語法格式
-
創建事件觸發器。
CREATE EVENT TRIGGER nameON event[ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]EXECUTE PROCEDURE function_name()
-
修改事件觸發器。
ALTER EVENT TRIGGER name DISABLE ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ] ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER EVENT TRIGGER name RENAME TO new_name
-
刪除事件觸發器。
DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ];
43.2 參數說明
-
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任何取值時可用。
43.3 示例
--創建事件觸發器函數(用于ddl_command_start、ddl_command_end事件)
openGauss=# create function test_event_trigger() returns event_trigger as $$
BEGINRAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag;
END
$$ language plpgsql;--創建事件觸發器函數(用于sql_drop事件)
openGauss=# CREATE OR REPLACE FUNCTION drop_sql_command()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE '% - sql_drop', tg_tag;
END;
$$ LANGUAGE plpgsql;--創建事件觸發器函數(用于table_rewrite事件)
openGauss=# CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
LANGUAGE plpgsql AS $$
BEGINRAISE EXCEPTION 'rewrites not allowed';
END;
$$;--創建事件類型為ddl_command_start的事件觸發器
openGauss=# create event trigger regress_event_trigger on ddl_command_startexecute procedure test_event_trigger();--創建事件類型為ddl_command_end的事件觸發器
openGauss=# create event trigger regress_event_trigger_end on ddl_command_endexecute procedure test_event_trigger();--創建事件類型為sql_drop的事件觸發器
openGauss=# CREATE EVENT TRIGGER sql_drop_command ON sql_dropEXECUTE PROCEDURE drop_sql_command();--創建事件類型為table_rewrite的事件觸發器
openGauss=# create event trigger no_rewrite_allowed on table_rewritewhen tag in ('alter table') execute procedure test_evtrig_no_rewrite();--執行ddl語句查看事件觸發器效果(觸發ddl_command_start與ddl_command_end)
openGauss=# create table event_trigger_table (a int);--執行alter table語句查看事件觸發器效果(觸發ddl_command_start與table_rewrite,ddl_command_end由于禁止rewrite報錯不觸發)
openGauss=# alter table event_trigger_table alter column a type numeric;--執行drop語句查看事件觸發器效果(觸發ddl_command_start、sql_drop與ddl_command_end)
openGauss=# drop table event_trigger_table;--修改事件觸發器
openGauss=# create role regress_evt_user WITH ENCRYPTED PASSWORD 'EvtUser123';
openGauss=# ALTER EVENT TRIGGER regress_event_trigger RENAME TO regress_event_trigger_start;
--應該失敗,事件觸發器的owner只能為超級用戶
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start owner to regress_evt_user;
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start disable;
openGauss=# ALTER EVENT TRIGGER regress_event_trigger_start enable always;--刪除事件觸發器
openGauss=# DROP EVENT TRIGGER regress_event_trigger_start;
openGauss=# DROP EVENT TRIGGER regress_event_trigger_end;
openGauss=# DROP EVENT TRIGGER sql_drop_command;
openGauss=# DROP EVENT TRIGGER no_rewrite_allowed;
👍 點贊,你的認可是我創作的動力!
?? 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進步的財富!