Postgresql

使用他執行的查詢記錄使用者的 ID

  • October 15, 2019

因此,當他呼叫函式時,我不僅嘗試記錄 postgres 使用者,還嘗試從我的表中記錄他的 ID(例如)Person (person_id)。

到目前為止,據我所知,我幾乎可以從這些系統表中獲得所需的所有資訊:

  • pg_stat_activity
  • pg_stat_statements如果我啟動它(但由於某些限制可能無法啟動)

但我似乎無法弄清楚的部分是我是否想從(例如)使用者表(user_id例如)記錄使用者的 ID。

基本上我想創建一個只存放上個月日誌的小表,我將插入其中。

  • user_id (不是系統 id,而是來自我自己的表)
  • IP地址
  • 他呼叫函式/查詢時的時間戳記
  • 他執行的查詢

我的主要問題是 user_id 部分,因為其他 3 個值已經存在於pg_stat_activity( client_addr, query_start, query)

如果沒有簡單的方法來實現這一點,假設我想創建一個函式,該函式將根據返回的參數以某種方式選擇 user_id pg_stat_activity,但我似乎無法弄清楚我將如何做到這一點。隱藏的表參數tableoid, cmin, cmax, xmin, xmax, ctid在這裡對我沒有幫助,至少我看不到如何,也許我錯過了什麼?

根據您的評論,INSERT可能看起來像這樣:

INSERT INTO log (userid, clientaddr, calltime, query)
SELECT user_id,  -- function argument
      a.client_addr,
      a.query_start,
      a.query
FROM pg_stat_activity AS a
WHERE a.pid = pg_backend_pid();

辨識目前會話的關鍵是後端程序的程序ID。

pg_stat_activity 有 application_name。您可以使用它來附加 person_id。在每個查詢之前,您可以在查詢下方執行

set application_name to my_application-<person_id>;

我們使用這種方式來記錄觸發查詢的 user_id 和模組。如果您以日誌格式指定,此 application_name 也會記錄在實際日誌中。

引用自:https://dba.stackexchange.com/questions/251104