PostgreSQL 登陸登出(login logout)事件觸發方法
標籤
PostgreSQL , 事件觸發器 , event trigger , hook , login hook , libpq
背景
PostgreSQL 支援event trigger,但是event侷限於DDL。當發生DDL時,可以觸發一些動作呼叫使用者自定義的event trigger函式,函式內容隨意,比如審計,比如DDL邏輯複製,比如許可權控制等。
對事件觸發器感興趣可以見我的GITHUB。
ofollow,noindex" target="_blank">《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#[email protected]
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