2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

69.3. 規劃器統計資訊和安全 #

對錶 pg_statistic 的訪問僅限於超級使用者,因此普通使用者無法從中瞭解到其他使用者表的具體內容。某些選擇性估算函式會使用使用者提供的運算子(查詢中出現的或相關的運算子)來分析儲存的統計資訊。例如,為了確定儲存的最常見值是否適用,選擇性估算器將必須執行相應 = 運算子來比較查詢中的常量與儲存的值。因此 pg_statistic 中的資料可能會被傳遞給使用者定義的函式。一個精心構造的運算子可以故意洩露傳遞的運算元(例如,透過記錄它們或將它們寫入另一個表),或者在錯誤訊息中顯示其值而意外洩露它們,在任何一種情況下都可能將 pg_statistic 中的資料暴露給不應看到它的使用者。

為了防止這種情況,以下規則適用於所有內建的選擇性估算函式。在規劃查詢時,為了能夠使用儲存的統計資訊,當前使用者必須擁有該表或相關列的 SELECT 許可權,或者使用的運算子必須是 LEAKPROOF(更準確地說,是運算子所基於的函式)。如果不是,則選擇性估算器將表現為沒有可用統計資訊,規劃器將繼續使用預設或後備假設。 psql 程式的 \do+ 元命令有助於確定哪些運算子被標記為 leakproof。

如果使用者對錶或列沒有所需的許可權,那麼在許多情況下,查詢最終會收到一個許可權被拒絕的錯誤,在這種情況下,這個機制在實踐中是不可見的。但是,如果使用者正在從安全屏障檢視中讀取,那麼規劃器可能希望檢查使用者通常無法訪問的底層表的統計資訊。在這種情況下,運算子應該是 leakproof 的,否則將不使用統計資訊。除了計劃可能不是最優之外,沒有直接的反饋。如果懷疑是這種情況,可以嘗試以更特權的使用者身份執行查詢,看看是否會產生不同的計劃。

此限制僅適用於規劃器需要對 pg_statistic 中的一個或多個值執行使用者定義的運算子的情況。因此,規劃器被允許使用通用的統計資訊,例如 NULL 值的比例或列中不同值的數量,而無需考慮訪問許可權。

第三方擴充套件中包含的選擇性估算函式,如果可能使用使用者定義的函式對統計資訊進行操作,則應遵循相同的安全規則。請參考 PostgreSQL 原始碼以獲取指導。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。