本文介绍了登录触发器和登出触发器功能。

简介

登录登出触发器是一种事件触发器,提供了可以在用户登录/登出时触发指定函数或存储过程的功能。登录是指用户直接连接到数据库时,Postgres backend进程启动后。登出是指用户在发起退出命令时,Postgres backend进程退出前。

语法

event name分别为AFTER LOGON ON DATABASEBEFORE 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;