PostgreSQL 登陆登出(login logout)事件触发方法
背景
PostgreSQL 支持event trigger,但是event局限于DDL。当发生DDL时,可以触发一些动作调用用户自定义的event trigger函数,函数内容随意,比如审计,比如DDL逻辑复制,比如权限控制等。
对事件触发器感兴趣可以见我的GITHUB。
《PostgreSQL 登陆登出(login logout)事件触发方法》
《PostgreSQL 事件触发器应用 - DDL审计记录 + 异步通知(notify)》
《PostgreSQL Oracle 兼容性之 - 事件触发器实现类似Oracle的回收站功能》
《use event trigger function record user who alter table’s SQL》
《PostgreSQL 事件触发器 - DDL审计 , DDL逻辑复制 , 打造DDL统一管理入》
《PostgreSQL 事件触发器 - PostgreSQL 9.3 Event Trigger》
接下来的问题是,当用户想在登陆数据库,退出数据库时触发一些UDF调用,该怎么办呢?
这里举个例子,多个业务,采用同一个数据库用户登陆,有TP型的业务,有AP型的业务。
为了防止TP AP互相干扰,
1、没有办法通过数据库用户配置来隔离,因为他们用了同一个用户。(当然,如果业务上可以使用不同的数据库用户,那么隔离就变得更加简单了,比如通过connection limit配置AP少量连接。)
2、如果通过业务层面的修改来设置参数,可以,但是可能需要动到业务。
其他的方法:
1、应用程序连接串,配置一些可配置参数。
对于AP业务,配置它的连接串。比如lock timeout, statement timeout, work_mem等,可以配大一些。
TP业务配置它的连接串。
2、应用程序连接串(libpq, jdbc等),配置识别参数application_name,比如TP配置为tp, AP配置为ap.
https://www.postgresql.org/docs/10/static/libpq-connect.html#LIBPQ-CONNSTRING
http://www.postgresqltutorial.com/postgresql-jdbc/
当连接到数据库时,通过application_name的值可以识别出来这个连接是AP连接的还是TP业务连接的。
3、结合HOOK,就可以实现登陆、退出的事件触发。
HOOK patch :
https://www.postgresql.org/message-id/flat/4EBC6852.5030605%40fuzzy.cz#4EBC6852.5030605@fuzzy.cz
HOOK 插件 :
https://github.com/pgaudit/set_user
4、除此之外,阿里云RDS PG提供了内置的资源隔离能力
《阿里云 RDS PostgreSQL 高并发特性 vs 社区版本 (1.6万并发: 3倍吞吐,240倍响应速度)》
参考
https://www.postgresql.org/docs/10/static/event-trigger-definition.html
https://www.postgresql.org/docs/10/static/libpq-connect.html#LIBPQ-CONNSTRING
http://www.postgresqltutorial.com/postgresql-jdbc/