本節描述的函式用於獲取有關 PostgreSQL 安裝的各種資訊。
表 9.71 顯示了幾個用於提取會話和系統資訊的函式。
除了本節列出的函式外,還有許多與統計系統相關的函式也提供系統資訊。有關更多資訊,請參閱 第 27.2.26 節。
表 9.71. 會話資訊函式
函式 描述 |
---|
返回當前資料庫的名稱。(SQL 標準中,資料庫稱為“目錄”(catalogs),因此 |
返回當前正在執行的查詢文字,如客戶端提交的(可能包含多個語句)。 |
這等同於 |
返回當前搜尋路徑中的第一個 schema 的名稱(如果搜尋路徑為空,則返回 NULL)。這是在建立物件時不指定目標 schema 時使用的 schema。 |
返回當前有效搜尋路徑中的所有 schema 名稱的陣列,按優先順序順序排列。( |
返回當前執行上下文的使用者名稱稱。 |
返回當前客戶端的 IP 地址,如果當前連線是透過 Unix 域套接字進行的,則返回 |
返回當前客戶端的 IP 埠號,如果當前連線是透過 Unix 域套接字進行的,則返回 |
返回伺服器接受當前連線的 IP 地址,如果當前連線是透過 Unix 域套接字進行的,則返回 |
返回伺服器接受當前連線的 IP 埠號,如果當前連線是透過 Unix 域套接字進行的,則返回 |
返回連線到當前會話的伺服器程序的程序 ID。 |
返回阻止具有指定程序 ID 的伺服器程序獲取鎖的會話的程序 ID 陣列,如果不存在此類伺服器程序或其未被阻止,則返回空陣列。 一個伺服器程序阻止另一個程序,是因為它持有與被阻止程序的鎖請求衝突的鎖(硬阻塞),或者它正在等待一個與被阻止程序的鎖請求衝突的鎖,並且在等待佇列中排在被阻止程序前面(軟阻塞)。使用並行查詢時,結果總是列出客戶端可見的程序 ID(即 頻繁呼叫此函式可能會對資料庫效能產生一定影響,因為它需要短時間內獨佔訪問鎖管理器共享狀態。 |
返回伺服器配置檔案最後載入的時間。如果當前會話在載入時處於活動狀態,這將是會話本身重新讀取配置檔案的時間(因此在不同會話中讀取時間會略有不同)。否則,它是 postmaster 程序重新讀取配置檔案的時間。 |
返回當前由日誌收集器使用的日誌檔案的路徑名。路徑包含 log_directory 目錄和單個日誌檔名。如果日誌收集器被停用,則返回 預設情況下,此函式僅限於超級使用者和具有 |
返回當前伺服器會話中已載入的可載入模組列表。 |
返回當前會話的臨時 schema 的 OID,如果沒有(因為它沒有建立任何臨時表)則返回零。 |
如果給定的 OID 是另一個會話的臨時 schema 的 OID,則返回 true。(例如,這對於從目錄顯示中排除其他會話的臨時表很有用。) |
如果伺服器已編譯支援NUMA支援,則返回 true。 |
返回當前會話正在監聽的非同步通知通道名稱的集合。 |
返回伺服器啟動的時間。 |
返回阻止具有指定程序 ID 的伺服器程序獲取安全快照的會話的程序 ID 陣列,如果不存在此類伺服器程序或其未被阻止,則返回空陣列。 執行 頻繁呼叫此函式可能會對資料庫效能產生一定影響,因為它需要短時間內訪問謂詞鎖管理器共享狀態。 |
返回當前 PostgreSQL 觸發器的巢狀級別(如果不是直接或間接從觸發器內部呼叫,則為 0)。 |
返回會話使用者的名稱。 |
返回使用者在身份驗證週期中提交的身份驗證方法和身份(如果有),然後才被分配資料庫角色。它表示為 |
這等同於 |
current_catalog
, current_role
, current_schema
, current_user
, session_user
, and user
在SQL中具有特殊的語法地位:它們必須在沒有尾隨括號的情況下呼叫。在 PostgreSQL 中,current_schema
可以選擇性地使用括號,但其他函式則不行。
通常,session_user
是啟動當前資料庫連線的使用者;但超級使用者可以使用 SET SESSION AUTHORIZATION 更改此設定。current_user
是適用於許可權檢查的使用者標識。通常它等於會話使用者,但可以使用 SET ROLE 更改。在執行具有 SECURITY DEFINER
屬性的函式期間,它也會發生變化。在 Unix 術語中,會話使用者是“真實使用者”(real user),當前使用者是“有效使用者”(effective user)。current_role
and user
是 current_user
的同義詞。(SQL 標準在 current_role
和 current_user
之間進行了區分,但 PostgreSQL 沒有,因為它將使用者和角色統一為一種實體。)
表 9.72 列出了允許以程式設計方式查詢物件訪問許可權的函式。(有關許可權的更多資訊,請參閱 第 5.8 節。)在這些函式中,要查詢許可權的使用者可以透過名稱或 OID(pg_authid
.oid
)指定;如果名稱為 public
,則檢查 PUBLIC 偽角色的許可權。此外,user
引數可以完全省略,在這種情況下假定為 current_user
。要查詢的物件也可以透過名稱或 OID 指定。按名稱指定時,如果相關,則可以包含 schema 名稱。感興趣的訪問許可權由文字字串指定,該字串必須求值為物件型別的適當許可權關鍵字之一(例如 SELECT
)。可選地,可以在許可權型別後面新增 WITH GRANT OPTION
來測試是否擁有授予選項。此外,多個許可權型別可以以逗號分隔,在這種情況下,如果列出的任何許可權被持有,則結果為 true。(許可權字串的大小寫不敏感,並且允許在許可權名稱之間有額外的空格,但在名稱內部不允許。)一些示例
SELECT has_table_privilege('myschema.mytable', 'select'); SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
表 9.72. 訪問許可權查詢函式
函式 描述 |
---|
使用者是否對錶的任何列擁有許可權?如果使用者對整個表擁有許可權,或者至少有一列具有列級別的許可權授予,則此函式成功。允許的許可權型別為 |
使用者是否對指定的表列擁有許可權?如果使用者對整個表擁有許可權,或者該列具有列級別的許可權授予,則此函式成功。列可以透過名稱或屬性編號( |
使用者是否對資料庫擁有許可權?允許的許可權型別為 |
使用者是否對外部資料包裝器擁有許可權?唯一允許的許可權型別是 |
使用者是否對函式擁有許可權?唯一允許的許可權型別是 透過名稱而非 OID 指定函式時,允許的輸入與 SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); |
使用者是否對語言擁有許可權?唯一允許的許可權型別是 |
使用者是否對大型物件擁有許可權?允許的許可權型別為 |
使用者是否對配置引數擁有許可權?引數名稱不區分大小寫。允許的許可權型別為 |
使用者是否對 schema 擁有許可權?允許的許可權型別為 |
使用者是否對序列擁有許可權?允許的許可權型別為 |
使用者是否對外部伺服器擁有許可權?唯一允許的許可權型別是 |
使用者是否對錶擁有許可權?允許的許可權型別為 |
使用者是否對錶空間擁有許可權?唯一允許的許可權型別是 |
使用者是否對資料型別擁有許可權?唯一允許的許可權型別是 |
使用者是否對角色擁有許可權?允許的許可權型別為 |
在當前使用者和當前環境的上下文中,指定表的行級安全性是否處於活動狀態? |
表 9.73 顯示了 aclitem
型別可用的運算子,它是訪問許可權的目錄表示。有關如何讀取訪問許可權值的資訊,請參閱 第 5.8 節。
表 9.73. aclitem
運算子
表 9.74 顯示了一些用於管理 aclitem
型別的其他函式。
表 9.74. aclitem
函式
函式 描述 |
---|
構造一個 |
將 |
使用給定的屬性構造一個 |
表 9.75 顯示了確定某個物件在當前 schema 搜尋路徑中是否“可見”的函式。例如,如果一個表所在的 schema 在搜尋路徑中,並且沒有同名表出現在搜尋路徑的前面,則該表被認為是可見的。這等同於該表可以不加 schema 限定地按名稱引用。因此,要列出所有可見表的名稱
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
對於函式和運算子,搜尋路徑中的一個物件如果名稱(以及引數資料型別)在前一個物件出現之前,則被認為是可見的。對於運算子類和運算子族,將同時考慮名稱和關聯的索引訪問方法。
表 9.75. Schema 可見性查詢函式
所有這些函式都需要物件的 OID 來識別要檢查的物件。如果要透過名稱測試物件,使用 OID 別名型別(regclass
, regtype
, regprocedure
, regoperator
, regconfig
, or regdictionary
)會很方便,例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
請注意,透過這種方式測試非 schema 限定的型別名稱沒有太大意義——如果名稱可以識別,它就必須是可見的。
表 9.76 列出了從系統目錄中提取資訊的函式。
表 9.76. 系統目錄資訊函式
函式 描述 |
---|
返回由型別 OID 和可能的型別修飾符標識的資料型別的 SQL 名稱。如果不知道特定的型別修飾符,則將型別修飾符傳遞為 NULL。 |
返回由其型別 OID 標識的域的基礎型別的 OID。如果引數是而非域型別的 OID,則按原樣返回引數。如果引數不是有效的型別 OID,則返回 NULL。如果存在域依賴鏈,它將遞迴查詢直到找到基礎型別。 假設
|
將提供的編碼名稱轉換為整數,該整數表示某些系統目錄表中使用的內部識別符號。如果提供了未知編碼名稱,則返回 |
將某些系統目錄表中用作編碼內部識別符號的整數轉換為人類可讀的字串。如果提供了無效的編碼號,則返回空字串。 |
返回描述 PostgreSQL 系統目錄中存在的外部索引鍵關係的記錄集。 |
重新構造約束的建立命令。(這是反編譯的重構,而不是原始命令文字。) |
反編譯儲存在系統目錄中的表示式的內部形式,例如列的預設值。如果表示式可能包含 Vars,請將它們引用的關係 OID 作為第二個引數指定;如果不預期存在 Vars,則傳遞零就足夠了。 |
重新建構函式或過程的建立命令。(這是反編譯的重構,而不是原始命令文字。)結果是一個完整的 |
以在 |
以在 |
以在 |
重新構造索引的建立命令。(這是反編譯的重構,而不是原始命令文字。)如果提供了 |
返回描述伺服器識別的 SQL 關鍵字的記錄集。 |
以 |
重新構造規則的建立命令。(這是反編譯的重構,而不是原始命令文字。) |
返回與列關聯的序列的名稱,如果該列沒有關聯序列,則返回 NULL。如果該列是標識列,則關聯的序列是為該列內部建立的序列。對於使用 serial 型別( 典型用法是在讀取標識列或 serial 列的序列的當前值時,例如: SELECT currval(pg_get_serial_sequence('sometable', 'id')); |
重新構造擴充套件統計物件的建立命令。(這是反編譯的重構,而不是原始命令文字。) |
重新構造觸發器的建立命令。(這是反編譯的重構,而不是原始命令文字。) |
根據角色的 OID 返回其名稱。 |
重新構造檢視或物化檢視的底層 |
重新構造檢視或物化檢視的底層 |
從檢視的文字名稱(而不是其 OID)重新構造檢視或物化檢視的底層 |
測試索引列是否具有指定的屬性。表 9.77 中列出了常見的索引列屬性。(請注意,擴充套件訪問方法可以為其索引定義其他屬性名稱。)如果屬性名稱未知或不適用於特定物件,或者 OID 或列號未標識有效物件,則返回 |
測試索引是否具有指定的屬性。表 9.78 中列出了常見的索引屬性。(請注意,擴充套件訪問方法可以為其索引定義其他屬性名稱。)如果屬性名稱未知或不適用於特定物件,或者 OID 未標識有效物件,則返回 |
測試索引訪問方法是否具有指定的屬性。訪問方法屬性列在 表 9.79 中。如果屬性名稱未知或不適用於特定物件,或者 OID 未標識有效物件,則返回 |
返回 |
返回與給定 GUC 關聯的標誌陣列,如果 GUC 不存在則返回 |
返回將物件儲存在指定表空間中的資料庫的 OID 集合。如果此函式返回任何行,則表空間不為空,不能被刪除。要識別填充表空間的特定物件,您需要連線到 |
返回此表空間所在的檔案系統路徑。 |
返回傳遞給它的值的 OID 資料型別。這對於故障排除或動態構建 SQL 查詢可能很有幫助。該函式被宣告為返回
|
返回傳遞給它的值的 collation 名稱。值將被引用並根據需要新增 schema 限定。如果引數表示式沒有推匯出 collation,則返回
|
將文字關係名稱轉換為其 OID。將字串轉換為 |
將文字 collation 名稱轉換為其 OID。將字串轉換為 |
將文字模式名稱轉換為其 OID。透過將字串強制轉換為 |
將文字運算子名稱轉換為其 OID。透過將字串強制轉換為 |
將帶引數型別的文字運算子名稱轉換為其 OID。透過將字串強制轉換為 |
將文字函式或過程名稱轉換為其 OID。透過將字串強制轉換為 |
將帶引數的文字函式或過程名稱轉換為其 OID。透過將字串強制轉換為 |
將文字角色名稱轉換為其 OID。透過將字串強制轉換為 |
解析文字字串,從中提取潛在的型別名稱,並將其轉換為型別 OID。字串中的語法錯誤將導致錯誤;但如果字串是一個語法上有效的型別名稱,但在目錄中未找到,則結果為 |
解析文字字串,從中提取潛在的型別名稱,並轉換其型別修飾符(如果存在)。字串中的語法錯誤將導致錯誤;但如果字串是一個語法上有效的型別名稱,但在目錄中未找到,則結果為
|
大多數用於重構(反編譯)資料庫物件的函式都包含一個可選的 pretty
標誌,如果該標誌為 true
,則結果會被“美化列印”。美化列印會抑制不必要的括號並新增空格以提高可讀性。美化列印格式更具可讀性,但預設格式在未來版本的 PostgreSQL 中更有可能被以相同方式解釋;因此,請避免將美化列印的輸出用於轉儲目的。將 false
傳遞給 pretty
引數會產生與省略該引數相同的結果。
表 9.77. 索引列屬性
名稱 | 描述 |
---|---|
asc |
在正向掃描時,列是否按升序排序? |
desc |
在正向掃描時,列是否按降序排序? |
nulls_first |
在正向掃描時,列是否將 NULL 值排在前面? |
nulls_last |
在正向掃描時,列是否將 NULL 值排在後面? |
orderable |
列是否具有任何已定義的排序順序? |
distance_orderable |
列是否可以透過“距離”運算子(例如 ORDER BY col <-> constant )按順序掃描? |
returnable |
列值是否可以透過僅索引掃描返回? |
search_array |
列是否原生支援 col = ANY(array) 搜尋? |
search_nulls |
列是否支援 IS NULL 和 IS NOT NULL 搜尋? |
表 9.78. 索引屬性
名稱 | 描述 |
---|---|
clusterable |
索引是否可以用於 CLUSTER 命令? |
index_scan |
索引是否支援普通(非點陣圖)掃描? |
bitmap_scan |
索引是否支援點陣圖掃描? |
backward_scan |
掃描方向是否可以在掃描中途改變(以支援游標上的 FETCH BACKWARD 而無需物化)? |
表 9.79. 索引訪問方法屬性
名稱 | 描述 |
---|---|
can_order |
訪問方法是否支援 CREATE INDEX 中的 ASC 、DESC 和相關關鍵字? |
can_unique |
訪問方法是否支援唯一索引? |
can_multi_col |
訪問方法是否支援多列索引? |
can_exclude |
訪問方法是否支援排除約束? |
can_include |
訪問方法是否支援 CREATE INDEX 的 INCLUDE 子句? |
表 9.80. GUC 標誌
Flag | 描述 |
---|---|
EXPLAIN |
帶有此標誌的引數包含在 EXPLAIN (SETTINGS) 命令中。 |
NO_SHOW_ALL |
帶有此標誌的引數不包含在 SHOW ALL 命令中。 |
NO_RESET |
帶有此標誌的引數不支援 RESET 命令。 |
NO_RESET_ALL |
帶有此標誌的引數不包含在 RESET ALL 命令中。 |
NOT_IN_SAMPLE |
預設情況下,帶有此標誌的引數不包含在 postgresql.conf 中。 |
RUNTIME_COMPUTED |
帶有此標誌的引數是執行時計算的引數。 |
表 9.81 列出了與資料庫物件標識和定址相關的函式。
表 9.81. 物件資訊和定址函式
pg_get_acl
對於檢索和檢查與資料庫物件關聯的許可權很有用,無需檢視特定目錄。例如,要檢索當前資料庫中所有物件的已授予許可權
postgres=# SELECT (pg_identify_object(s.classid,s.objid,s.objsubid)).*, pg_catalog.pg_get_acl(s.classid,s.objid,s.objsubid) AS acl FROM pg_catalog.pg_shdepend AS s JOIN pg_catalog.pg_database AS d ON d.datname = current_database() AND d.oid = s.dbid JOIN pg_catalog.pg_authid AS a ON a.oid = s.refobjid AND s.refclassid = 'pg_authid'::regclass WHERE s.deptype = 'a'; -[ RECORD 1 ]----------------------------------------- type | table schema | public name | testtab identity | public.testtab acl | {postgres=arwdDxtm/postgres,foo=r/postgres}
表 9.82. 註釋資訊函式 中顯示的函式用於提取使用 COMMENT 命令之前儲存的註釋。如果找不到指定引數的註釋,則返回 null 值。
表 9.82. 註釋資訊函式
表 9.83. 資料有效性檢查函式 中顯示的函式有助於檢查建議輸入資料的有效性。
表 9.83. 資料有效性檢查函式
表 9.84. 事務 ID 和快照資訊函式 中顯示的函式以可匯出格式提供伺服器事務資訊。這些函式的主要用途是確定在兩個快照之間提交了哪些事務。
表 9.84. 事務 ID 和快照資訊函式
函式 描述 |
---|
返回提供的事務 ID 與當前事務計數器之間的事務數。 |
返回提供的多事務 ID 與當前多事務計數器之間的多事務 ID 數。 |
返回當前事務的 ID。如果當前事務尚無 ID(因為它尚未執行任何資料庫更新),它將分配一個新的 ID;有關詳細資訊,請參閱 第 67.1 節。如果在子事務中執行,這將返回頂層事務 ID;有關詳細資訊,請參閱 第 67.3 節。 |
返回當前事務的 ID,如果尚未分配 ID,則返回 |
報告最近一次事務的提交狀態。結果是 |
返回當前快照,這是一個顯示哪些事務 ID 當前正在進行的的資料結構。快照僅包含頂層事務 ID;不顯示子事務 ID;有關詳細資訊,請參閱 第 67.3 節。 |
返回快照中包含的正在進行的事務 ID 集合。 |
返回快照的 |
返回快照的 |
給定的事務 ID 是否根據此快照可見(即,它是在快照拍攝之前完成的)?請注意,此函式對於子事務 ID(subxid)不會給出正確答案;有關詳細資訊,請參閱 第 67.3 節。 |
返回指定多事務 ID 的每個成員的事務 ID 和鎖定模式。鎖定模式 |
內部事務 ID 型別 xid
是 32 位寬,每 40 億次事務迴繞一次。但是,表 9.84. 事務 ID 和快照資訊函式 中顯示的函式(age
、mxid_age
和 pg_get_multixact_members
除外)使用 64 位型別 xid8
,該型別在安裝生命週期內不會迴繞,如果需要,可以轉換為 xid
型別;有關詳細資訊,請參閱 第 67.1 節。pg_snapshot
資料型別儲存有關特定時間點事務 ID 可見性的資訊。其元件在表 9.85. 快照元件 中描述。pg_snapshot
的文字表示為
。例如 xmin
:xmax
:xip_list
10:20:10,14,15
表示 xmin=10, xmax=20, xip_list=10, 14, 15
。
表 9.85. 快照元件
名稱 | 描述 |
---|---|
xmin |
最低仍然活躍的事務 ID。所有小於 xmin 的事務 ID 要麼已提交併可見,要麼已回滾並死掉。 |
xmax |
最高已完成事務 ID 的下一個 ID。在快照拍攝時,所有大於或等於 xmax 的事務 ID 都尚未完成,因此是不可見的。 |
xip_list |
快照拍攝時正在進行的事務。事務 ID xmin <= 且不在此列表中的事務在快照拍攝時已完成,因此根據其提交狀態可見或死掉。此列表不包含子事務(subxids)的事務 ID。 |
在 13 版之前的 PostgreSQL 版本中,沒有 xid8
型別,因此提供了使用 bigint
來表示 64 位 XID 的函式的變體,並且具有相應的不同快照資料型別 txid_snapshot
。這些舊函式名稱中包含 txid
。它們仍然為了向後相容而支援,但可能會在未來版本中被移除。請參閱 表 9.86。
表 9.86. 已棄用的事務 ID 和快照資訊函式
表 9.87. 已提交事務資訊函式 中顯示的函式提供有關過去事務提交時間的資訊。只有當 track_commit_timestamp 配置選項啟用且僅對啟用後提交的事務有用時,它們才提供有用資料。通常會在 vacuum 過程中刪除提交時間戳資訊。
表 9.87. 已提交事務資訊函式
表 9.88. 控制資料函式 中顯示的函式會列印在 initdb
期間初始化的資訊,例如目錄版本。它們還顯示有關預寫日誌和檢查點處理的資訊。這些資訊是叢集範圍的,不特定於任何單個數據庫。這些函式提供與 pg_controldata 應用程式相同的資訊,來自同一源。
表 9.88. 控制資料函式
表 9.89. pg_control_checkpoint
輸出列
Column Name | Data Type |
---|---|
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.90. pg_control_system
輸出列
Column Name | Data Type |
---|---|
pg_control_version |
integer |
catalog_version_no |
integer |
system_identifier |
bigint |
pg_control_last_modified |
timestamp with time zone |
表 9.91. pg_control_init
輸出列
Column Name | Data Type |
---|---|
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 |
default_char_signedness |
boolean |
表 9.92. pg_control_recovery
輸出列
Column Name | Data Type |
---|---|
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.93. 版本資訊函式 中顯示的函式會列印版本資訊。
表 9.93. 版本資訊函式
函式 描述 |
---|
返回描述 PostgreSQL 伺服器版本的字串。您還可以從 server_version 獲取此資訊,或者為了獲得機器可讀的版本,請使用 server_version_num。軟體開發人員應使用 |
返回表示 PostgreSQL 使用的 Unicode 版本的字串。 |
如果伺服器使用 ICU 構建,則返回表示 ICU 使用的 Unicode 版本的字串;否則返回 |
表 9.94. WAL 摘要資訊函式 中顯示的函式會列印有關 WAL 摘要狀態的資訊。請參閱 summarize_wal。
表 9.94. WAL 摘要資訊函式
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。