本節描述的函數用於取得關於 PostgreSQL 安裝的各種資訊。
表 9.69 顯示了幾個提取工作階段和系統資訊的函數。
除了本節列出的函數外,還有一些與統計系統相關的函數也提供系統資訊。有關更多資訊,請參閱第 27.2.26 節。
表 9.69. 工作階段資訊函數
函數 描述 |
---|
傳回目前資料庫的名稱。(在 SQL 標準中,資料庫稱為「目錄」,因此 |
傳回目前正在執行的查詢的文字,由用戶端提交(可能包含多個陳述式)。 |
這等同於 |
傳回搜尋路徑中第一個結構描述的名稱(如果搜尋路徑為空,則傳回空值)。這是將用於任何在未指定目標結構描述的情況下建立的資料表或其他具名物件的結構描述。 |
以優先順序傳回目前有效搜尋路徑中所有結構描述名稱的陣列。(目前的 search_path 設定中,不對應於現有、可搜尋結構描述的項目將被省略。)如果布林引數為 |
傳回目前執行環境的使用者名稱。 |
傳回目前用戶端的 IP 位址,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回目前用戶端的 IP 埠號,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回伺服器接受目前連線的 IP 位址,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回伺服器接受目前連線的 IP 連接埠號碼,如果目前連線是透過 Unix 網域 Socket,則傳回 |
傳回附加到目前連線的伺服器進程 ID。 |
傳回一個陣列,其中包含因無法取得鎖定而阻擋具有指定進程 ID 的伺服器進程的連線之進程 ID。如果沒有此伺服器進程或未被阻擋,則傳回一個空陣列。 如果一個伺服器進程持有與被阻擋進程的鎖定請求衝突的鎖定(硬阻擋),或者正在等待與被阻擋進程的鎖定請求衝突的鎖定,並且在等待佇列中排在其前面(軟阻擋),則會阻擋另一個伺服器進程。當使用並行查詢時,結果總是列出客戶端可見的進程 ID(也就是 頻繁呼叫此函數可能會對資料庫效能產生一些影響,因為它需要在短時間內獨佔存取鎖定管理器的共享狀態。 |
傳回上次載入伺服器組態檔案的時間。 如果目前的連線在該時間存在,這將是連線本身重新讀取組態檔案的時間(因此,不同連線的讀取時間會略有不同)。 否則,這是 postmaster 進程重新讀取組態檔案的時間。 |
傳回日誌收集器目前使用的日誌檔的路徑名稱。 該路徑包括 log_directory 目錄和個別日誌檔名。 如果已停用日誌收集器,則結果為 預設情況下,此函數僅限於超級使用者和具有 |
傳回目前連線的暫時 Schema 的 OID,如果沒有(因為尚未建立任何暫時資料表),則傳回零。 |
如果給定的 OID 是另一個連線的暫時 Schema 的 OID,則傳回 true。(例如,這可用於從目錄顯示中排除其他連線的暫時資料表。) |
傳回目前連線正在監聽的非同步通知通道名稱的集合。 |
傳回目前被等待處理的通知佔用的非同步通知佇列最大大小的分數 (0–1)。 有關更多資訊,請參閱 LISTEN 和 NOTIFY。 |
傳回伺服器啟動的時間。 |
傳回一個陣列,其中包含因無法取得安全快照而阻擋具有指定進程 ID 的伺服器進程的連線之進程 ID。如果沒有此伺服器進程或未被阻擋,則傳回一個空陣列。 執行 頻繁呼叫此函數可能會對資料庫效能產生一些影響,因為它需要在短時間內存取謂詞鎖定管理器的共享狀態。 |
傳回 PostgreSQL 觸發程序的目前巢狀層級 (如果不是直接或間接從觸發程序內部呼叫,則為 0)。 |
傳回連線使用者的名稱。 |
傳回使用者在被分配資料庫角色之前,在驗證週期中提供的驗證方法和身份(如果有的話)。 它表示為 |
這等同於 |
current_catalog
、current_role
、current_schema
、current_user
、session_user
和 user
在SQL中具有特殊的語法狀態:它們必須在沒有尾隨括號的情況下呼叫。 在 PostgreSQL 中,可以選擇性地與 current_schema
一起使用括號,但不能與其他括號一起使用。
session_user
通常是啟動目前資料庫連線的使用者;但超級使用者可以使用SET SESSION AUTHORIZATION來變更此設定。current_user
則是適用於權限檢查的使用者識別符。通常它與 session user 相同,但可以使用SET ROLE來變更。它也會在使用具有 SECURITY DEFINER
屬性的函數執行期間發生變更。在 Unix 術語中,session user 是「真實使用者 (real user)」,而 current user 是「有效使用者 (effective user)」。current_role
和 user
是 current_user
的同義詞。(SQL 標準區分了 current_role
和 current_user
,但 PostgreSQL 沒有區分,因為它將使用者和角色統一為單一類型的實體。)
表 9.70 列出了允許以程式方式查詢物件存取權限的函數。(有關權限的更多資訊,請參閱第 5.8 節。)在這些函數中,可以透過名稱或 OID (pg_authid
.oid
) 指定要查詢其權限的使用者,如果名稱給定為 public
,則會檢查 PUBLIC 偽角色的權限。 此外,user
參數可以完全省略,在這種情況下,會假定為 current_user
。 要查詢的物件也可以透過名稱或 OID 來指定。 以名稱指定時,如果相關,則可以包含綱要名稱。 感興趣的存取權限由文字字串指定,該字串必須評估為物件類型的適當權限關鍵字之一(例如,SELECT
)。或者,可以在權限類型中新增 WITH GRANT OPTION
,以測試是否持有具有授權選項的權限。 此外,可以列出多個以逗號分隔的權限類型,在這種情況下,如果持有任何列出的權限,則結果將為 true。(權限字串的大小寫並不重要,並且允許在權限名稱之間但不在權限名稱內使用額外的空白。) 一些範例:
SELECT has_table_privilege('myschema.mytable', 'select'); SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
表 9.70. 存取權限查詢函數
函數 描述 |
---|
使用者是否對表格的任何欄位具有權限? 如果對整個表格持有權限,或者如果至少有一個欄位具有欄位層級的權限授予,則此函數成功。 允許的權限類型為 |
使用者是否對指定的表格欄位具有權限? 如果對整個表格持有權限,或者如果該欄位具有欄位層級的權限授予,則此函數成功。 可以依名稱或屬性編號 ( |
使用者是否對資料庫具有權限? 允許的權限類型為 |
使用者是否對外部資料包裝器具有權限? 唯一允許的權限類型為 |
使用者是否對函數具有權限? 唯一允許的權限類型為 以名稱而非 OID 指定函數時,允許的輸入與 SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); |
使用者是否對語言具有權限? 唯一允許的權限類型為 |
使用者是否對組態參數具有權限? 參數名稱不區分大小寫。 允許的權限類型為 |
使用者是否具有 schema 的權限? 允許的權限類型為 |
使用者是否具有 sequence 的權限? 允許的權限類型為 |
使用者是否具有外部伺服器的權限? 唯一允許的權限類型為 |
使用者是否具有 table 的權限? 允許的權限類型為 |
使用者是否具有 tablespace 的權限? 唯一允許的權限類型為 |
使用者是否具有 data type 的權限? 唯一允許的權限類型為 |
使用者是否具有 role 的權限? 允許的權限類型為 |
在目前使用者和目前環境的上下文中,是否為指定的 table 啟用 row-level security? |
表 9.71 顯示 aclitem
類型的可用運算子,它是存取權限的目錄表示。 有關如何讀取存取權限值的資訊,請參閱第 5.8 節。
表 9.71. aclitem
運算子
表 9.72 顯示一些其他函數來管理 aclitem
類型。
表 9.72. aclitem
函數
函數 描述 |
---|
建構一個 |
將 |
使用給定的屬性建構一個 |
表 9.73 顯示判斷特定物件在目前 schema 搜尋路徑中是否可見的函數。例如,如果一個 table 的 containing schema 在搜尋路徑中,並且在搜尋路徑中沒有較早出現相同名稱的 table,則該 table 被認為是可見的。這等同於聲明該 table 可以通過名稱引用,而無需顯式的 schema 限定詞。因此,要列出所有可見 table 的名稱
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
對於函數和運算符,如果搜尋路徑中沒有相同名稱和參數資料類型的物件較早出現,則該物件被認為是可見的。對於運算符類別和系列,將同時考慮名稱和關聯的索引存取方法。
表 9.73. Schema可見性查詢函數
所有這些函數都需要物件 OID 來識別要檢查的物件。如果您想按名稱測試物件,使用 OID 別名類型(regclass
、regtype
、regprocedure
、regoperator
、regconfig
或 regdictionary
)會很方便,例如
SELECT pg_type_is_visible('myschema.widget'::regtype);
請注意,以這種方式測試非 schema 限定的類型名稱沒有多大意義——如果該名稱可以被識別,它一定是可見的。
表 9.74 列出從系統目錄中提取資訊的函數。
表 9.74. 系統目錄資訊函數
函數 描述 |
---|
傳回由其類型 OID 和可能的類型修飾符標識的資料庫資料類型之 SQL 名稱。如果沒有特定的修飾符,則將 NULL 傳遞給類型修飾符。 |
傳回由其類型 OID 識別的網域之基本類型 OID。如果參數是非網域類型的 OID,則按原樣傳回參數。如果參數不是有效的類型 OID,則傳回 NULL。如果存在網域相依性的鏈,它將遞迴直到找到基本類型。 假設
|
將提供的編碼名稱轉換為一個整數,表示某些系統目錄 table 中使用的內部識別碼。如果提供了未知的編碼名稱,則傳回 |
將某些系統目錄表中所使用的編碼內部識別碼整數,轉換為人類可讀的字串。如果提供了無效的編碼數字,則返回空字串。 |
傳回一組描述 PostgreSQL 系統目錄中存在之外鍵關係的記錄。 |
重建約束的建立指令。(這是反編譯重建,而不是指令的原始文字。) |
反編譯儲存在系統目錄中的表達式的內部形式,例如欄位的預設值。如果表達式可能包含 Vars,請將它們引用的關係的 OID 指定為第二個參數;如果預期沒有 Vars,則傳遞零就足夠了。 |
重建函式或程序的建立指令。(這是反編譯重建,而不是指令的原始文字。)結果是一個完整的 |
重建函式或程序的引數列表,其形式與在 |
重建識別函式或程序所需的引數列表,其形式與在 |
重建函式的 |
重建索引的建立指令。(這是反編譯重建,而不是指令的原始文字。)如果提供了 |
傳回一組描述伺服器識別之 SQL 關鍵字的記錄。 |
重建分割資料表分割鍵的定義,其形式與 |
重建規則的建立指令。(這是反編譯重建,而不是指令的原始文字。) |
傳回與欄位關聯的序列名稱,如果欄位未與任何序列關聯,則傳回 NULL。如果欄位是識別欄位,則關聯的序列是為該欄位內部建立的序列。對於使用其中一種序列類型( 一個典型的用途是讀取識別欄位或序列欄位的序列的當前值,例如 SELECT currval(pg_get_serial_sequence('sometable', 'id')); |
重建擴充統計物件的建立命令。(這是一個反編譯的重建,而不是命令的原始文字。) |
重建觸發器的建立命令。(這是一個反編譯的重建,而不是命令的原始文字。) |
根據角色 OID 傳回角色的名稱。 |
重建視窗或具體化視窗的底層 |
重建視窗或具體化視窗的底層 |
從視窗的文字名稱而不是其 OID 重建視窗或具體化視窗的底層 |
測試索引欄位是否具有指定的屬性。常見的索引欄位屬性列在表格 9.75中。(請注意,擴充存取方法可以為其索引定義其他屬性名稱。)如果屬性名稱未知或不適用於特定物件,或者 OID 或欄位編號未識別有效的物件,則傳回 |
測試索引是否具有指定的屬性。常見的索引屬性列在表格 9.76中。(請注意,擴充存取方法可以為其索引定義其他屬性名稱。)如果屬性名稱未知或不適用於特定物件,或者 OID 未識別有效的物件,則傳回 |
測試索引存取方法是否具有指定的屬性。存取方法屬性列在表格 9.77中。如果屬性名稱未知或不適用於特定物件,或者 OID 未識別有效的物件,則傳回 |
傳回由 |
傳回與給定 GUC 關聯的旗標陣列,如果該 GUC 不存在,則傳回 |
傳回具有儲存在指定表空間中的物件的資料庫的 OID 集合。如果此函數傳回任何列,則表示表空間不為空,無法卸除。若要識別填入表空間的特定物件,您需要連線到由 |
傳回此表空間所在的檔案系統路徑。 |
傳回傳遞給它的值的資料類型 OID。這對於疑難排解或動態建構 SQL 查詢很有幫助。該函數宣告為傳回
|
傳回傳遞給它的值的排序規則名稱。如有必要,該值會加上引號並限定綱要。如果沒有為引數表達式衍生出排序規則,則傳回
|
將文字關係名稱轉換為其 OID。將字串轉換為 |
將文字排序規則名稱轉換為其 OID。將字串轉換為 |
將文字綱要名稱轉換為其 OID。將字串轉換為 |
將文字運算子名稱轉換為其 OID。將字串轉換為 |
將文字運算子名稱(帶有參數類型)轉換為其 OID。將字串轉換為 |
將文字函數或程序名稱轉換為其 OID。將字串轉換為 |
將文字函數或程序名稱(帶有引數類型)轉換為其 OID。將字串轉換為 |
將文字角色名稱轉換為其 OID。將字串轉換為 |
剖析文字字串,從中提取可能的類型名稱,然後將該名稱轉換為類型 OID。字串中的語法錯誤將導致錯誤;但是,如果該字串是語法上有效的類型名稱,但恰好在目錄中找不到,則結果為 |
剖析文字字串,從中提取可能的類型名稱,然後轉換其類型修飾詞(如果有的話)。字串中的語法錯誤將導致錯誤;但是,如果該字串是語法上有效的類型名稱,但恰好在目錄中找不到,則結果為
|
大多數重建(反編譯)資料庫物件的函數都有一個可選的 pretty
旗標,如果為 true
,則會導致結果 「美化列印」。美化列印會抑制不必要的括號,並增加空格以提高可讀性。美化列印的格式更易於閱讀,但預設格式更有可能被未來版本的 PostgreSQL 以相同方式解讀;因此,避免將美化列印的輸出用於傾印目的。為 pretty
參數傳遞 false
會產生與省略該參數相同的結果。
表 9.75. 索引欄屬性
名稱 | 描述 |
---|---|
asc |
該欄是否在正向掃描時以遞增順序排序? |
desc |
該欄是否在正向掃描時以遞減順序排序? |
nulls_first |
該欄是否在正向掃描時以空值優先順序排序? |
nulls_last |
該欄是否在正向掃描時以空值最後順序排序? |
orderable |
該欄是否具有任何已定義的排序順序? |
distance_orderable |
是否可以按 「距離」 運算子依順序掃描該欄,例如 ORDER BY col <-> constant ? |
returnable |
是否可以通過僅索引掃描返回該欄的值? |
search_array |
該欄是否原生支援 col = ANY(array) 搜尋? |
search_nulls |
該欄是否支援 IS NULL 和 IS NOT NULL 搜尋? |
表 9.76. 索引屬性
名稱 | 描述 |
---|---|
clusterable |
索引是否可用於 CLUSTER 指令? |
index_scan |
索引是否支援純粹的(非點陣圖)掃描? |
bitmap_scan |
索引是否支援點陣圖掃描? |
backward_scan |
掃描方向是否可以在掃描中途變更(以便在不需要物化的情況下,支援游標的 FETCH BACKWARD )? |
表 9.77. 索引存取方法屬性
名稱 | 描述 |
---|---|
can_order |
存取方法是否支援 CREATE INDEX 中的 ASC 、DESC 和相關關鍵字? |
can_unique |
存取方法是否支援唯一索引? |
can_multi_col |
存取方法是否支援具有多個欄位的索引? |
can_exclude |
存取方法是否支援排除約束? |
can_include |
存取方法是否支援 CREATE INDEX 的 INCLUDE 子句? |
表 9.78. GUC 旗標
旗標 | 描述 |
---|---|
EXPLAIN |
帶有此旗標的參數會包含在 EXPLAIN (SETTINGS) 指令中。 |
NO_SHOW_ALL |
帶有此旗標的參數會從 SHOW ALL 指令中排除。 |
NO_RESET |
帶有此旗標的參數不支援 RESET 指令。 |
NO_RESET_ALL |
帶有此旗標的參數會從 RESET ALL 指令中排除。 |
NOT_IN_SAMPLE |
預設情況下,帶有此旗標的參數不會包含在 postgresql.conf 中。 |
RUNTIME_COMPUTED |
帶有此旗標的參數是執行階段計算的參數。 |
表 9.79 列出了與資料庫物件識別和定址相關的函數。
表 9.79. 物件資訊和定址函數
表 9.80 中顯示的函數會擷取先前使用 COMMENT 指令儲存的註解。 如果找不到指定參數的註解,則傳回 null 值。
表 9.80. 註解資訊函數
表 9.81 中顯示的函數對於檢查提議的輸入資料的有效性很有幫助。
表 9.81. 資料有效性檢查函數
表 9.82 中顯示的函數以可匯出的形式提供伺服器交易資訊。 這些函數的主要用途是確定兩個快照之間已提交哪些交易。
表 9.82. 交易 ID 和快照資訊函數
函數 描述 |
---|
傳回目前交易的 ID。如果目前的交易尚未有 ID(因為它尚未執行任何資料庫更新),則將分配一個新的 ID;請參閱第 66.1 節以取得詳細資訊。如果在子交易中執行,這將傳回頂層交易 ID;請參閱第 66.3 節以取得詳細資訊。 |
傳回目前交易的 ID,如果尚未分配 ID,則傳回 |
報告最近交易的提交狀態。 結果是 |
傳回目前的快照,這是一種資料結構,顯示哪些交易 ID 目前正在進行中。 快照中僅包含頂層交易 ID;不顯示子交易 ID;請參閱第 66.3 節以取得詳細資訊。 |
傳回快照中包含的正在進行中的交易 ID 的集合。 |
傳回快照的 |
傳回快照的 |
根據此快照,給定的交易 ID 是否可見(也就是說,它是否在建立快照之前完成)?請注意,此函數不會針對子交易 ID (subxid) 提供正確的答案;請參閱第 66.3 節以取得詳細資訊。 |
內部交易 ID 類型 xid
是 32 位元寬,並且每 40 億筆交易會循環一次。但是,表 9.82 中顯示的函數使用 64 位元類型 xid8
,在安裝的生命週期內不會循環,並且如果需要,可以轉換為 xid
,方法是使用型別轉換;詳情請參閱第 66.1 節。資料類型 pg_snapshot
儲存特定時間點的交易 ID 可見性資訊。其組成部分在表 9.83 中描述。pg_snapshot
的文字表示形式為
。例如,xmin
:xmax
:xip_list
10:20:10,14,15
表示 xmin=10, xmax=20, xip_list=10, 14, 15
。
表 9.83. 快照組成部分
名稱 | 描述 |
---|---|
xmin |
仍在活動中的最低交易 ID。所有小於 xmin 的交易 ID 要么已提交並可見,要么已回滾且已失效。 |
xmax |
超過已完成的最高交易 ID 一個單位。所有大於或等於 xmax 的交易 ID 在快照時尚未完成,因此不可見。 |
xip_list |
快照時正在進行中的交易。如果交易 ID xmin <= 且不在這個列表中,則在快照時已經完成,因此根據其提交狀態,要么可見,要么已失效。此列表不包括子交易 (subxids) 的交易 ID。 |
在 13 之前的 PostgreSQL 版本中,沒有 xid8
類型,因此提供了使用 bigint
表示 64 位元 XID 的這些函數的變體,以及相應不同的快照資料類型 txid_snapshot
。這些較舊的函數名稱中包含 txid
。為了向後相容,仍然支援它們,但可能會在未來的版本中移除。請參閱表 9.84。
表 9.84. 已棄用的交易 ID 和快照資訊函數
表 9.85 中顯示的函數提供有關過去交易何時提交的資訊。只有在啟用 track_commit_timestamp 配置選項後,並且僅適用於在其啟用後提交的交易,它們才提供有用的資料。提交時間戳記資訊通常在 vacuum 期間移除。
表 9.85. 已提交交易資訊函數
表 9.86 中顯示的函數會印出在 initdb
期間初始化的資訊,例如目錄版本。它們還顯示有關預寫記錄和檢查點處理的資訊。此資訊是叢集範圍的,而不是特定於任何一個資料庫。這些函數提供與 pg_controldata 應用程式相同的大部分資訊,來自相同的來源。
表 9.86. 控制資料函數
表 9.87. pg_control_checkpoint
輸出欄位
欄位名稱 | 資料類型 |
---|---|
checkpoint_lsn |
pg_lsn |
redo_lsn |
pg_lsn |
redo_wal_file |
text |
timeline_id |
integer |
prev_timeline_id |
integer |
full_page_writes |
boolean |
next_xid |
text |
next_oid |
oid |
next_multixact_id |
xid |
next_multi_offset |
xid |
oldest_xid |
xid |
oldest_xid_dbid |
oid |
oldest_active_xid |
xid |
oldest_multi_xid |
xid |
oldest_multi_dbid |
oid |
oldest_commit_ts_xid |
xid |
newest_commit_ts_xid |
xid |
checkpoint_time |
timestamp with time zone |
表 9.88. pg_control_system
輸出欄位
欄位名稱 | 資料類型 |
---|---|
pg_control_version |
integer |
catalog_version_no |
integer |
system_identifier |
bigint |
pg_control_last_modified |
timestamp with time zone |
表 9.89. pg_control_init
輸出欄位
欄位名稱 | 資料類型 |
---|---|
max_data_alignment |
integer |
database_block_size |
integer |
blocks_per_segment |
integer |
wal_block_size |
integer |
bytes_per_wal_segment |
integer |
max_identifier_length |
integer |
max_index_columns |
integer |
max_toast_chunk_size |
integer |
large_object_chunk_size |
integer |
float8_pass_by_value |
boolean |
data_page_checksum_version |
integer |
表 9.90. pg_control_recovery
輸出欄位
欄位名稱 | 資料類型 |
---|---|
min_recovery_end_lsn |
pg_lsn |
min_recovery_end_timeline |
integer |
backup_start_lsn |
pg_lsn |
backup_end_lsn |
pg_lsn |
end_of_backup_record_required |
boolean |
表 9.91中顯示的函數會印出版本資訊。
表 9.91. 版本資訊函數
函數 描述 |
---|
傳回一個字串,描述 PostgreSQL 伺服器的版本。 您也可以從server_version取得此資訊,或者若要取得機器可讀的版本,請使用server_version_num。 軟體開發人員應使用 |
傳回一個字串,表示 PostgreSQL 使用的 Unicode 版本。 |
如果伺服器是使用 ICU 支援建置的,則傳回一個字串,表示 ICU 使用的 Unicode 版本;否則傳回 |
表 9.92中顯示的函數會印出關於 WAL 摘要狀態的資訊。 請參閱summarize_wal。
表 9.92. WAL 摘要資訊函數
如果您在文件中發現任何不正確的內容、與您特定功能的使用經驗不符,或需要進一步澄清,請使用此表單報告文件問題。