PostgreSQL 登陆登出(login logout)事件触发方法

less than 1 minute read

背景

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

《PostgreSQL HooK 介绍》

https://www.postgresql.org/docs/10/static/libpq-connect.html#LIBPQ-CONNSTRING

http://www.postgresqltutorial.com/postgresql-jdbc/

Flag Counter

digoal’s 大量PostgreSQL文章入口