本節描述的函數用於取得關於 PostgreSQL 安裝的各種資訊。
表 9.69 顯示了幾個提取會話和系統資訊的函數。
除了本節列出的函數外,還有許多與統計系統相關的函數也提供系統資訊。 參見 第 27.2.26 節 以取得更多資訊。
表 9.69. 會話資訊函數
函數 描述 |
---|
回傳目前資料庫的名稱。(在 SQL 標準中,資料庫被稱為「目錄」,因此 |
回傳目前正在執行的查詢的文字,由客戶端提交(可能包含多個語句)。 |
這相當於 |
回傳搜尋路徑中第一個結構描述的名稱(如果搜尋路徑為空,則回傳空值)。 這是將用於建立任何未指定目標結構描述的表格或其他命名物件的結構描述。 |
依優先順序回傳目前有效搜尋路徑中所有結構描述名稱的陣列。(目前的 search_path 設定中,與現有、可搜尋的結構描述不符的項目會被省略。)如果布林參數為 |
回傳目前執行內容的使用者名稱。 |
回傳目前客戶端的 IP 位址,如果目前連線透過 Unix 網域套接字,則回傳 |
傳回目前用戶端的 IP 埠號,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回伺服器接受目前連線的 IP 位址,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回伺服器接受目前連線的 IP 埠號,如果目前的連線是透過 Unix 網域 socket,則傳回 |
傳回附加到目前會話的伺服器程序的程序 ID。 |
傳回一個陣列,其中包含阻止具有指定程序 ID 的伺服器程序取得鎖定的會話的程序 ID。如果沒有這樣的伺服器程序或它未被阻止,則傳回一個空陣列。 如果一個伺服器程序持有的鎖與被阻止程序的鎖定請求衝突(硬性阻止),或者正在等待與被阻止程序的鎖定請求衝突且在等待隊列中位於其之前的鎖(軟性阻止),則它會阻止另一個伺服器程序。 使用平行查詢時,結果總是列出客戶端可見的程序 ID(即, 頻繁呼叫此函數可能會對資料庫效能產生一些影響,因為它需要在短時間內獨佔訪問鎖定管理員的共享狀態。 |
傳回伺服器組態檔案上次載入的時間。 如果目前的會話當時處於活動狀態,則這將是會話本身重新讀取組態檔案的時間(因此,不同會話的讀取會略有不同)。 否則,它是 postmaster 程序重新讀取組態檔案的時間。 |
傳回目前由日誌收集器使用的日誌檔的路徑名稱。 該路徑包含 log_directory 目錄和個別日誌檔名。 如果日誌收集器已停用,則結果為 預設情況下,此函數僅限於超級使用者和具有 |
傳回目前會話的暫存綱要的 OID,如果它沒有暫存綱要(因為它沒有建立任何暫存表格),則傳回零。 |
如果給定的 OID 是另一個會話的暫存綱要的 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
是適用於權限檢查的使用者識別碼。通常它等於會話使用者,但可以使用 SET ROLE 變更。它也會在使用 SECURITY DEFINER
屬性的函式執行期間變更。用 Unix 術語來說,會話使用者是「「真實使用者」」,目前使用者是「「有效使用者」」。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'); |
使用者是否擁有語言的權限?唯一允許的權限類型為 |
使用者是否擁有組態參數的權限?參數名稱不區分大小寫。允許的權限類型為 |
使用者是否擁有綱要的權限?允許的權限類型為 |
使用者是否擁有序列的權限?允許的權限類型為 |
使用者是否擁有外部伺服器的權限?唯一允許的權限類型為 |
使用者是否擁有表格的權限?允許的權限類型為 |
使用者是否擁有表空間的權限?唯一允許的權限類型為 |
使用者是否擁有資料類型的權限?唯一允許的權限類型為 |
使用者是否擁有角色的權限?允許的權限類型為 |
在目前的使用者和目前的環境背景下,是否針對指定的表格啟用了資料列層級安全性? |
表 9.71 顯示了 aclitem
類型可用的運算子,它是存取權限的目錄表示。請參閱第 5.8 節,以瞭解如何讀取存取權限值。
表 9.71. aclitem
運算子
表 9.72 顯示了一些額外的函式來管理 aclitem
類型。
表 9.72. aclitem
函式
函數 描述 |
---|
建構一個 |
將 |
使用給定的屬性建構一個 |
表 9.73 顯示了確定某個物件在目前結構描述搜尋路徑中是否可見的函式。 例如,如果表格的包含結構描述在搜尋路徑中,並且沒有同名的表格出現在搜尋路徑的較早位置,則該表格被認為是可見的。 這等同於該表格可以透過名稱引用而無需明確的結構描述限定的陳述。 因此,若要列出所有可見表格的名稱
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
對於函式和運算子,如果路徑中較早沒有具有相同名稱和引數資料類型的物件,則搜尋路徑中的物件被認為是可見的。 對於運算子類別和系列,會考慮名稱和相關的索引存取方法。
表 9.73. 結構描述可見性查詢函式
所有這些函數都需要物件 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。 如果存在領域依賴關係鏈,它將遞迴直到找到基本類型。 假設
|
將提供的編碼名稱轉換為表示某些系統目錄表中使用的內部識別碼的整數。 如果提供了未知的編碼名稱,則傳回 |
將用作某些系統目錄表中編碼的內部識別碼的整數轉換為人類可讀的字串。 如果提供了無效的編碼號碼,則傳回空字串。 |
傳回一組描述在 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 以相同的方式解譯;因此,避免將美觀列印的輸出用於傾印目的。將 false
傳遞給 pretty
參數會產生與省略參數相同的結果。
表 9.75. 索引欄位屬性
名稱 | 描述 |
---|---|
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.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 指令儲存的註解。如果找不到指定參數的註解,則會傳回空值。
表 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 |
在拍攝快照時正在進行中的交易。在快照拍攝時,xmin <= 且不在這個清單中的交易 ID 已經完成,因此根據其提交狀態是可見或已失效。此清單不包含子交易 (subxid) 的交易 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 使用的 Unicode 版本的字串,如果伺服器是以 ICU 支援建置的;否則傳回 |
表 9.92 中顯示的函數會印出關於 WAL 摘要狀態的資訊。請參閱 summarize_wal。
表 9.92. WAL 摘要資訊函數
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。