本文介紹了登入觸發器和登出觸發器功能。
簡介
登入登出觸發器是一種事件觸發程序,提供了可以在使用者登入/登出時觸發指定函數或預存程序的功能。登入是指使用者直接連接到資料庫時,Postgres backend
進程啟動後。登出是指使用者在發起退出命令時,Postgres backend
進程退出前。
文法
event name分別為
AFTER LOGON ON DATABASE
和BEFORE LOGOFF ON DATABASE
。CREATE EVENT TRIGGER trigger_name event_login_or_logoff
EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
event_login_or_logoff:
AFTER LOGON ON DATABASE
| BEFORE LOGOFF ON DATABASE
注意事項
- 如果使用了串連池、串連代理等第三方工具,由於是在backend進程啟動和退出時才會觸發這兩種觸發器,可能導致在用戶端斷開或串連時不能及時觸發。
- 和其他事件觸發程序相同,對於同一個事件,例如登入,擁有多個觸發器時,其中一個失敗了,所有觸發器的行為都會被終止且進行交易回復。
- 登出觸發器觸發時,出現錯誤後,會將錯誤詳細資料列印到log中,因為此時用戶端可能已經退出,導致無法輸出到用戶端,因此僅僅輸出到log。同理,登入觸發器觸發時,由於用戶端未準備好,所以也需要將錯誤詳細資料列印到log中,此時PolarDB會嘗試向用戶端發送一個waring:
event trigger occur error after user login. For more information, see log.
。 - PolarDB相容Oracle在系統觸發器中的登入/登出觸發器提供的以下幾個PL變數:
- polar_login_user:登入的使用者名稱,text類型。
- polar_database_name:登入的資料庫名,text類型。
- polar_instance_num:登入的叢集數量,固定為1,int類型。
- polar_client_ip:登入資料的用戶端IP,text類型。
樣本
- 準備測試資料。
CREATE TABLE users_log ( id serial, user_name VARCHAR2(64), database_name VARCHAR2(64), event VARCHAR2(64), client_ip VARCHAR2(64), tag VARCHAR2(64), instance_num int ); CREATE function sample_event_trigger return event_trigger is begin INSERT into polar_loginout.users_log (user_name,database_name,event,client_ip, tag, instance_num) values (polar_login_user,polar_database_name,tg_event,polar_client_ip,tg_tag,polar_instance_num); end;
- 建立登入觸發器。
CREATE EVENT TRIGGER hr.logon_trigger AFTER LOGON ON DATABASE execute function public.sample_event_trigger();
- 建立登出觸發器。
CREATE EVENT TRIGGER hr.logoff_trigger BEFORE LOGOFF ON DATABASE execute function public.sample_event_trigger();
- 刪除登入觸發器。
DROP event trigger logon_trigger;
- 刪除登出觸發器。
DROP event trigger logoff_trigger;