本文介绍了登录触发器和登出触发器功能。
简介
登录登出触发器是一种事件触发器,提供了可以在用户登录/登出时触发指定函数或存储过程的功能。登录是指用户直接连接到数据库时,Postgres backend
进程启动后。登出是指用户在发起退出命令时,Postgres backend
进程退出前。
语法
event name分别为
after_user_logon
和before_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;