對 pg_statistic
資料表的存取僅限於超級使用者,因此一般使用者無法從中得知其他使用者的資料表的內容。某些選擇性估算函數將使用使用者提供的運算子(查詢中出現的運算子或相關運算子)來分析儲存的統計資料。例如,為了確定儲存的最常見值是否適用,選擇性估算器必須執行適當的 =
運算子,以將查詢中的常數與儲存的值進行比較。因此,pg_statistic
中的資料可能會傳遞給使用者定義的運算子。經過適當設計的運算子可能會故意洩漏傳遞的運算元(例如,透過記錄它們或將它們寫入另一個資料表),或因在錯誤訊息中顯示它們的值而意外洩漏它們,在這兩種情況下,都可能將 pg_statistic
中的資料暴露給不應能夠看到它的使用者。
為了防止這種情況發生,以下內容適用於所有內建的選擇性估算函數。在規劃查詢時,為了能夠使用儲存的統計資料,目前使用者必須對資料表或相關欄位具有 SELECT
權限,或者使用的運算子必須是 LEAKPROOF
(更準確地說,是運算子所基於的函數)。如果不是,則選擇性估算器將表現得好像沒有統計資料可用,並且規劃器將繼續使用預設或後備假設。
如果使用者沒有資料表或欄位所需的權限,那麼在許多情況下,查詢最終會收到權限拒絕錯誤,在這種情況下,此機制在實務上是不可見的。但是,如果使用者正在從安全屏障檢視讀取,那麼規劃器可能希望檢查使用者無法存取的底層資料表的統計資料。在這種情況下,運算子應該是防洩漏的,否則將不會使用統計資料。沒有關於此的直接反饋,除了計畫可能不是最佳的。如果懷疑是這種情況,可以嘗試以具有更高權限的使用者身分執行查詢,看看是否會產生不同的計畫。
此限制僅適用於規劃器需要在 pg_statistic
中的一個或多個值上執行使用者定義的運算子的情況。因此,無論存取權限如何,規劃器都可以使用一般統計資訊,例如空值的比例或欄位中不同值的數量。
第三方擴充功能中包含的選擇性估算函數,可能會在使用使用者定義的運算子時對統計資料進行運算,應遵循相同的安全規則。請查閱 PostgreSQL 原始碼以尋求指導。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格回報文件問題。