本文介紹了登錄觸發器和登出觸發器功能。

簡介

登錄登出觸發器是一種事件觸發器,提供了可以在用戶登錄/登出時觸發指定函數或存儲過程的功能。登錄是指用戶直接連接到數據庫時,Postgres backend進程啟動后。登出是指用戶在發起退出命令時,Postgres backend進程退出前。

語法

event name分別為after_user_logonbefore_user_logoff
CREATE EVENT TRIGGER trigger_name event_login_or_logoff
            EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'

event_login_or_logoff:
          on after_user_logon
        | on before_user_logoff

注意事項

  • 如果使用了連接池、連接代理等第三方工具,由于是在backend進程啟動和退出時才會觸發這兩種觸發器,可能導致在客戶端斷開或連接時不能及時觸發。
  • 和其他事件觸發器相同,對于同一個事件,例如登錄,擁有多個觸發器時,其中一個失敗了,所有觸發器的行為都會被終止且進行事務回滾。
  • 登出觸發器觸發時,出現錯誤后,會將錯誤詳細信息打印到log中,因為此時客戶端可能已經退出,導致無法輸出到客戶端,因此僅僅輸出到log。同理,登錄觸發器觸發時,由于客戶端未準備好,所以也需要將錯誤詳細信息打印到log中,此時PolarDB會嘗試向客戶端發送一個waring:event trigger occur error after user login. For more information, see log.

示例

  • 準備測試數據。
    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 login_event_trigger on after_user_logon
        execute procedure public.sample_event_trigger();
  • 創建登出觸發器。
    CREATE event trigger logout_event_trigger on before_user_logoff
        execute procedure public.sample_event_trigger();
  • 刪除登錄觸發器。
    DROP event trigger login_event_trigger;
  • 刪除登出觸發器。
    DROP event trigger logout_event_trigger;