全部產品
Search
文件中心

PolarDB:系統資訊函數和運算子

更新時間:Jul 06, 2024

本文介紹了PolarDB PostgreSQL版(相容Oracle)支援的系統資訊函數和運算子。

會話資訊函數表展示了多個可以抽取會話和系統資訊的函數。除了本節列出的函數,還有一些與統計系統相關的函數也提供系統資訊。 會話資訊函數

current_catalogname

current_database () → name

返回當前資料庫的名稱。(在SQL標準中資料庫被稱為“catalogs”,因此current_catalog是該標準的拼字方式)

current_query () → text

返回當前所執行查詢的文本,由用戶端提交的(可能包含一個以上的語句)。

current_rolename

這個等同於 current_user

current_schemaname

current_schema () → name

返回在搜尋路徑中的第一個模式的名稱(如果搜尋路徑為空白則返回空值)。 這個模式將用於沒有指定目標模式就建立的任何錶或其他已命名物件。

current_schemas ( include_implicit boolean ) → name[]

返回當前在有效搜尋路徑中的所有模式的名稱的數組,以優先順序順序。如果布爾參數為true,則類似pg_catalog的隱式搜尋的系統模式將包含在結果中。

current_username

返回當前執行內容的使用者名稱。

inet_client_addr () → inet

返回當前用戶端的IP地址,如果當前串連是通過Unix-域通訊端則返回NULL

inet_client_port () → integer

返回當前用戶端的IP連接埠號碼,如果當前串連是通過Unix-域通訊端則返回NULL

inet_server_addr () → inet

返回伺服器接受當前串連的IP地址,如果當前串連是通過Unix-域通訊端則返回NULL

inet_server_port () → integer

返回伺服器接受當前串連的IP連接埠號碼,如果當前串連是通過Unix-域通訊端則返回NULL

pg_backend_pid () → integer

返回附加到當前會話的伺服器處理序的進程ID。

pg_blocking_pids ( integer ) → integer[]

返回阻止伺服器處理序的會話的進程ID數組,該進程ID與指定的進程ID一起擷取鎖定,如果沒有這樣的伺服器處理序或者沒有被阻塞,則返回一個空數組。

如果一個伺服器處理序持有一個與被阻塞進程的鎖請求衝突的鎖(硬阻塞),或者正在等待一個與被阻塞進程的鎖請求衝突並且在等待隊列中位於其前面的鎖(軟阻塞),那麼這個伺服器處理序就會阻塞另一個伺服器處理序。 當使用並行查詢時結果總是列出用戶端可見的進程ID(即pg_backend_pid的結果),即使實際的鎖是由子背景工作處理序持有或等待的。 因此,結果中可能存在重複的pid。還要注意當準備好的事務持有衝突鎖時,它將用零進程ID表示。

頻繁調用這個函數可能會對資料庫效能產生一些影響,因為它需要在短時間內獨佔訪問鎖管理器的共用狀態。

pg_conf_load_time () → timestamp with time zone

返回伺服器設定檔最後載入的時間。如果當前會話當時是活躍的,那麼這將是會話本身重新讀取設定檔的時間(因此在不同的會話中讀取會稍有不同)。 否則,就是postmaster進程重新讀取設定檔的時間。

pg_current_logfile ( [ text ] ) → text

返回日誌採集器當前使用的記錄檔的路徑名。該路徑包括log_directory目錄和單個記錄檔名。 如果日誌採集器被禁用,結果為NULL。當存在多個記錄檔時,每個檔案的格式都不同,不帶參數的pg_current_logfile將返回在有序列表中找到的第一種格式的檔案路徑:stderrcsvlog。 如果沒有記錄檔具有任何這些格式,則返回NULL。 要請求關於特定記錄檔格式的資訊,可以提供 csvlogstderr作為選擇性參數的值。 如果在log_destination中沒有配置需要的日誌格式,則結果為NULL。 結果反映了current_logfiles檔案的內容。

pg_my_temp_schema () → oid

返回當前會話的臨時模式的OID,如果沒有則返回0(因為它沒有建立任何暫存資料表)。

pg_is_other_temp_schema ( oid ) → boolean

如果給定的OID是另一個會話的臨時模式的OID則返回真。(這可能是有用的,例如,在目錄顯示中排除其他會話的暫存資料表)。

pg_jit_available () → boolean

如果JIT編譯器擴充可用,並且jit配置參數設定為on,則返回真。

pg_listening_channels () → setof text

返回當前會話正在偵聽的非同步通知通道的名稱集。

pg_notification_queue_usage () → double precision

返回當前被等待處理的通知所佔用的非同步通知隊列最大尺寸的分數(0–1)。更多資訊請參見LISTEN 和 NOTIFY。

pg_postmaster_start_time () → timestamp with time zone

返回伺服器啟動時的時間。

pg_safe_snapshot_blocking_pids ( integer ) → integer[]

返回一個進程ID數組,該進程ID是阻塞伺服器處理序擷取安全快照的會話的進程ID數組,如果沒有這樣的伺服器處理序或者沒有阻塞,則返回一個空數組。

運行SERIALIZABLE事務的會話會阻止SERIALIZABLE READ ONLY DEFERRABLE事務擷取快照,直到後者確定可以安全地避免擷取謂詞鎖。

頻繁調用這個函數可能會對資料庫效能產生一些影響,因為它需要在短時間內訪問謂詞鎖管理器的共用狀態。

pg_trigger_depth () → integer

返回當前嵌套層次的本資料庫觸發器(如果沒有調用則為 0,直接或間接,從一個觸發器內部開始)。

session_username

返回會話使用者名稱.

username

這個相當於 current_user

version () → text

返回描述本資料庫伺服器的版本的字串。

重要

current_catalogcurrent_rolecurrent_schemacurrent_usersession_useruser在 SQL 裡有特殊的語意狀態: 它們被調用時結尾不要跟著園括弧。 在 PostgreSQL 中,圓括弧可以有選擇性地被用於current_schema,但是不能和其他的一起用。

session_user通常是發起當前資料庫連接的使用者,不過超級使用者可以用SET SESSION AUTHORIZATION修改這個設定。 current_user是用於許可權檢查的使用者標識。通常, 它總是等於會話使用者,但是可以被SET ROLE改變。 它也會在函數執行的過程中隨著屬性SECURITY DEFINER的改變而改變。 在 Unix 的說法裡,那麼會話使用者是“真實使用者”,而目前使用者是“有效使用者”。 current_role以及usercurrent_user的同義字(SQL 標準在current_rolecurrent_user之間做了區分,但本資料庫不區分,因為它把使用者和角色統一成了一種實體)。

存取權限查詢函數表列出那些允許編程查詢對象存取權限的函數。在這些函數中,可以通過名稱或 OID (pg_authid.oid)指定被查詢許可權的使用者,或者如果名稱被指定為public,則檢查 PUBLIC 偽角色的許可權。 同樣,user參數可以完全省略,在這種情況下,假設為current_user。被查詢的對象也可以通過名稱或 OID 來指定。 通過名稱指定時,可以包含相關的模式名稱。感興趣的存取權限由一個文本字串指定,它必須計算為物件類型的一個適當的許可權關鍵字(例如,SELECT)。 還可以將 WITH GRANT OPTION添加到特權類型中,以測試該特權是否由授予選項持有。 同樣,可以用逗號分隔列出多個特權類型,在這種情況下,如果所列出的特權中有任何一個被持有,結果將為真。 (特權字串的大小寫不重要,特權名之間允許有額外的空格,但在特權名中不允許)。

    SELECT has_table_privilege('myschema.mytable', 'select');
    SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

存取權限查詢函數

has_any_column_privilege ( [ user name or oid, ] table text or oid, privilege text ) → boolean

使用者是否對錶的任何列有許可權? 如果對整個表持有特權,或者對至少一個列有列級的特權授予,則會成功。 允許的權限類別型為SELECT, INSERT,UPDATE, 和 REFERENCES

has_column_privilege ( [ user name or oid, ] table text or oid, column text or smallint, privilege text ) → boolean

使用者對指定的表列有特權麼?如果對整個表持有特權,或者對列授予了列層級的特權,則會成功。 可以通過名稱或屬性編號(pg_attribute.attnum)指定列。 允許的特權類型為SELECT, INSERT,UPDATE, 和 REFERENCES

has_database_privilege ( [ user name or oid, ] database text or oid, privilege text ) → boolean

使用者對資料庫有特權嗎?允許的特權類型為CREATE,CONNECT,TEMPORARY, 和TEMP(相當於 TEMPORARY)。

has_foreign_data_wrapper_privilege ( [ user name or oid, ] fdw text or oid, privilege text ) → boolean

使用者是否擁有外部資料封裝的特權?唯一允許的特權類型是USAGE

has_function_privilege ( [ user name or oid, ] function text or oid, privilege text ) → boolean

使用者對函數有特權嗎?唯一允許的特權類型是EXECUTE

當通過名稱而不是OID指定函數時,允許的輸入與regprocedure資料類型相同。一個例子為:

has_language_privilege ( [ user name or oid, ] language text or oid, privilege text ) → boolean

使用者對語言有特權嗎?唯一允許的特權類型是USAGE

has_schema_privilege ( [ user name or oid, ] schema text or oid, privilege text ) → boolean

使用者對模式有特權嗎?允許的特權類型是CREATEUSAGE

has_sequence_privilege ( [ user name or oid, ] sequence text or oid, privilege text ) → boolean

使用者是否有順序特權?允許的特權類型有USAGE, SELECT, 和UPDATE

has_server_privilege ( [ user name or oid, ] server text or oid, privilege text ) → boolean

使用者是否對外部伺服器有特權?唯一允許的特權類型是USAGE

has_table_privilege ( [ user name or oid, ] table text or oid, privilege text ) → boolean

使用者對錶有特權嗎?允許的特權類型有SELECT, INSERT,UPDATE, DELETE,TRUNCATE, REFERENCES,和 TRIGGER

has_tablespace_privilege ( [ user name or oid, ] tablespace text or oid, privilege text ) → boolean

使用者對錶空間有特權嗎?唯一允許的特權類型是CREATE

has_type_privilege ( [ user name or oid, ] type text or oid, privilege text ) → boolean

使用者對資料類型有特權嗎?唯一允許的特權類型是 USAGE。 當通過名稱而不是OID指定類型時,允許的輸入與regtype資料類型相同。

pg_has_role ( [ user name or oid, ] role text or oid, privilege text ) → boolean

使用者對角色有特權麼?允許的特權類型是MEMBERUSAGEMEMBER表示角色中的直接或間接成員關係(即執行SET ROLE的權利),而USAGE表示不執行SET ROLE情況下是否立即可用角色的特權。 此函數不允許特殊情況下將user設定為public,因為PUBLIC偽角色永遠不能成為真實角色的成員。

row_security_active ( table text or oid ) → boolean

在目前使用者和當前環境的上下文之中,指定表的行級安全是活動的嗎?

aclitem 操作符表顯示了aclitem類型的可用操作符,它是存取權限的目錄表示。

aclitem 操作符

aclitem = aclitemboolean

aclitem相等嗎?(注意,aclitem類型缺少比較操作符的通常集合;它只有相等。 反而言之,aclitem數組只能進行相等比較)。

'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitemf

aclitem[] @> aclitemboolean

數組是否包含指定的特權?(如果有一個數組條目與aclitem的被授權人和授予人相匹配,並且至少具有特權的指定集,則此選項為真)。

'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*/hobbes'::aclitemt

aclitem[] ~ aclitemboolean

這是@>的已棄用別名。

'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitemt

aclitem 函數表顯示了一些額外的函數來管理aclitem類型。

aclitem 函數

acldefault ( type "char", ownerId oid ) → aclitem[]

構造一個aclitem數組,該數組持有type類型對象的預設存取權限,該對象屬於OID為ownerId的角色。 這表示當對象的ACL條目為空白時所假定的存取權限。 type 參數必須是下列中的一個 'c' 對應 COLUMN, 'r' 對應 TABLE 和類表對象, 's' 對應 SEQUENCE, 'd' 對應 DATABASE, 'f' 對應 FUNCTIONPROCEDURE, 'l' 對應 LANGUAGE, 'L' 對應 LARGE OBJECT, 'n' 對應 SCHEMA, 't' 對應 TABLESPACE, 'F' 對應 FOREIGN DATA WRAPPER, 'S' 對應 FOREIGN SERVER,或 'T' 對應 TYPEDOMAIN.

aclexplode ( aclitem[] ) → setof record ( grantor oid, grantee oid, privilege_type text, is_grantable boolean )

以行集的形式返回aclitem數組。如果受讓人是偽角色PUBLIC,則在grantee列中用0表示。 每個被授予的特權都表示為SELECT, INSERT等。 注意,每個特權被分割成單獨的一行,因此在privilege_type列中只出現一個關鍵字。

makeaclitem ( grantee oid, grantor oid, privileges text, is_grantable boolean ) → aclitem

使用給定的屬性構造 aclitem

模式可見度查詢函數表展示了決定是否一個特定對象在當前模式搜尋路徑中可見的函數。 例如,如果一個表所在的模式在當前搜尋路徑中並且在它之前沒有出現過相同的名字,這個表就被說是可見的。 這等價於在語句中表可以被用名稱引用但不加顯式的模式限定。因此,要列出所有可見表的名字:

    SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

對於函數和操作符,如果路徑前面沒有相同名稱and argument data type(s)的對象,那麼搜尋路徑中的對象就是可見的。 對於操作符類和操作符族,要考慮名稱和關聯的索引存取方法。

模式可見度查詢函數

pg_collation_is_visible ( collation oid ) → boolean

定序在搜尋路徑中可見嗎?

pg_conversion_is_visible ( conversion oid ) → boolean

轉換在搜尋路徑中可見嗎?

pg_function_is_visible ( function oid ) → boolean

函數在搜尋路徑中可見嗎?(這也適用於過程和彙總)。

pg_opclass_is_visible ( opclass oid ) → boolean

操作符類在搜尋路徑中可見嗎?

pg_operator_is_visible ( operator oid ) → boolean

操作符在搜尋路徑中可見嗎?

pg_opfamily_is_visible ( opclass oid ) → boolean

操作符族在搜尋路徑中可見嗎?

pg_statistics_obj_is_visible ( stat oid ) → boolean

統計對象在搜尋路徑中可見嗎?

pg_table_is_visible ( table oid ) → boolean

表在搜尋路徑中可見嗎?(這適用於所有類型的關係,包括視圖、物化視圖、索引、序列和外部表格)。

pg_ts_config_is_visible ( config oid ) → boolean

文本搜尋配置在搜尋路徑可見嗎?

pg_ts_dict_is_visible ( dict oid ) → boolean

文本搜尋字典在搜尋路徑可見嗎?

pg_ts_parser_is_visible ( parser oid ) → boolean

文本搜尋解析器在搜尋路徑中可見嗎?

pg_ts_template_is_visible ( template oid ) → boolean

文本搜尋模板在搜尋路徑可見嗎?

pg_type_is_visible ( type oid ) → boolean

類型(或域)在搜尋路徑中可見嗎?

所有這些函數都要求用對象 OID 來標識將被檢查的對象。如果你想用名稱來測試一個對象,使用 OID 別名資料型別(regclassregtyperegprocedureregoperatorregconfigregdictionary)將會很方便。例如:

    SELECT pg_type_is_visible('myschema.widget'::regtype);

注意以這種方式測試一個非模式限定的類型名沒什麼意義 — 如果該名稱完全能被識別,它必須是可見的。

系統目錄資訊函數表列出從系統目錄中提取資訊的函數。

系統目錄資訊函數

format_type ( type oid, typemod integer ) → text

返回由其類型OID和可能的類型修飾符標識的資料類型的SQL名稱。如果沒有已知的類型修飾符,則傳遞NULL值給類型修飾符。

pg_get_constraintdef ( constraint oid [, pretty boolean ] ) → text

重構為了約束的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)。

pg_get_expr ( expr pg_node_tree, relation oid [, pretty boolean ] ) → text

反編譯儲存在系統目錄中的運算式的內部形式,例如列的預設值。 如果運算式可能包含變數,則指定它們所指向的關係的OID作為第二個參數;如果沒有預期的變數,傳遞0就可以了。

pg_get_functiondef ( func oid ) → text

重構為了函數或過程的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)結果是一個完整的CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE語句。

pg_get_function_arguments ( func oid ) → text

重新建構函式或過程的參數列表,以其在 CREATE FUNCTION裡面需要出現的形式(包括預設值)。

pg_get_function_identity_arguments ( func oid ) → text

重新構造標識函數或過程所需的參數列表,以其應出現在ALTER FUNCTION等命令中的形式。這個表單省略預設值。

pg_get_function_result ( func oid ) → text

重構函數的RETURNS子句,以其需要出現在CREATE FUNCTION中的形式。對於過程,返回NULL

pg_get_indexdef ( index oid [, column integer, pretty boolean ] ) → text

重構針對索引的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)如果提供了column而且不為零,則只重構該列的定義。

pg_get_keywords () → setof record ( word text, catcode "char", catdesc text )

返回一組描述伺服器識別的SQL關鍵字的記錄。word列包含關鍵字。 catcode列包含一個類別代碼:U表示無保留關鍵字,C表示可以是列名的關鍵字,T表示可以是類型或函數名的關鍵字,或者R表示完全保留關鍵字。 catdesc列包含描述類別的可能本地化字串。

pg_get_ruledef ( rule oid [, pretty boolean ] ) → text

重構針對規則的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)

pg_get_serial_sequence ( table text, column text ) → text

返回與列相關聯的序列名稱,如果沒有序列與該列相關聯則返回NULL。 如果列是識別欄位,則關聯序列是在內部為該列建立的序列。 對於使用一種串列類型(serial, smallserial, bigserial)建立的列,它是為該串列列定義建立的序列。 在後一種情況下,可以使用ALTER SEQUENCE OWNED BY修改或刪除關聯。 (這個函數可能應該被稱為pg_get_owned_sequence;它的當前名稱反映了它在歷史上曾與串列類型的列一起使用)。 第一個參數是具有可選模式的表名,第二個參數是列名。 由於第一個參數可能包含模式名和表名,因此按照通常的SQL規則解析它,這意味著預設情況下它是小寫。 第二個參數只是一個列名,按照字面來處理,因此保留了它的大小寫。結果經過了適當的格式化,可以傳遞給序列函數。

典型的用法是讀取序列的當前值以擷取標識或串列列,樣本如下:

pg_get_statisticsobjdef ( statobj oid ) → text

重構針對擴充統計對象的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)

pg_get_triggerdef ( trigger oid [, pretty boolean ] ) → text

重構針對觸發器的建立命令。(這是一個反編譯的重構,而不是命令的原始文本)

pg_get_userbyid ( role oid ) → name

根據OID返回角色名稱。

pg_get_viewdef ( view oid [, pretty boolean ] ) → text

重構針對視圖或物化視圖的SELECT命令。(這是一個反編譯的重構,而不是命令的原始文本)

pg_get_viewdef ( view oid, wrap_column integer ) → text

重構針對視圖或物化視圖的底層SELECT命令。(這是一個反編譯的重構,而不是命令的原始文本)在這種形式的函數中,總是啟用美觀列印,並對長行進行換行,以盡量使它們小於指定的列數。

pg_get_viewdef ( view text [, pretty boolean ] ) → text

根據視圖的文本名稱而不是它的OID,重構針對視圖或物化視圖的底層SELECT命令。(這是棄用,請使用OID變體)

pg_index_column_has_property ( index regclass, column integer, property text ) → boolean

測試一個索引列是否具有命名屬性。索引列屬性工作表列出了常用索引列屬性。(注意,擴充存取方法可以為其索引定義額外的屬性名稱。) 如果屬性名稱未知或不適用於特定對象,或者OID或列號不能識別有效對象,則返回NULL

pg_index_has_property ( index regclass, property text ) → boolean

測試一個索引是否具有命名屬性。索引性質表列出了常用的索引屬性。(注意,擴充存取方法可以為其索引定義額外的屬性名稱)。如果屬性名稱未知或不適用於特定對象,或者OID不能識別有效對象,則返回NULL

pg_indexam_has_property ( am oid, property text ) → boolean

測試索引存取方法是否具有命名屬性。存取方法屬性如索引存取方法性質表所示。 如果屬性名稱未知或不適用於特定對象,或者OID不能識別有效對象,則返回NULL

pg_options_to_table ( options_array text[] ) → setof record ( option_name text, option_value text )

返回源自pg_class.reloptionspg_attribute.attoptions的值表示的儲存選項集。

pg_tablespace_databases ( tablespace oid ) → setof oid

返回具有儲存在指定資料表空間中的對象的資料庫的OIDs集。 如果這個函數返回了任何行,那麼資料表空間就不是空的,且不能被刪除。 要識別填充資料表空間的特定對象,需要串連到由pg_tablespace_databases標識的資料庫,並查詢它們的pg_class目錄。

pg_tablespace_location ( tablespace oid ) → text

返回資料表空間所在的檔案系統路徑。

pg_typeof ( "any" ) → regtype

返回傳遞值給它的資料類型的OID。這對於故障排除或動態構造SQL查詢很有協助。 函式宣告為返回regtype,它是一個OID別名資料型別; 這意味著,為了比較,它與OID相同,但顯示為類型名。

例如:

COLLATION FOR ( "any" ) → text

返回傳遞值給它的定序的名稱。如果需要,該值會被引號括起來,並使用模式限定。 如果沒有為參數運算式派生定序,則返回NULL。如果參數不是可排序資料類型,則會引發錯誤。

例如:

to_regclass ( text ) → regclass

將文本關係名轉換為它的OID。通過將字串類型轉換為regclass可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regcollation ( text ) → regcollation

將文本定序名稱轉換為它的OID。通過將字串類型轉換為regcollation可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regnamespace ( text ) → regnamespace

將文字模式名轉換為它的OID。通過將字串轉換為regnamespace類型可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regoper ( text ) → regoper

將文本操作符名稱轉換為它的OID。通過將字串類型轉換為regoper可以得到類似的結果; 但是,如果找不到名稱或名稱有多義性,該函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regoperator ( text ) → regoperator

將文本操作符名稱(帶有參數類型)轉換為其OID。通過將字串轉換為regoperator類型可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regproc ( text ) → regproc

將文本函數或過程名轉換為其OID。通過將字串轉換為regproc類型可以得到類似的結果; 但是,如果找不到名稱或名稱有多義性,該函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regprocedure ( text ) → regprocedure

將文本函數或過程名(帶有參數類型)轉換為其OID。通過將字串類型轉換為regprocedure可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regrole ( text ) → regrole

將文本角色名稱轉換為它的OID。通過將字串類型轉換為regrole可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

to_regtype ( text ) → regtype

將文本類型名轉換為它的OID。通過將字串類型轉換為regtype可以得到類似的結果; 但是,如果沒有找到名稱,這個函數將返回NULL而不會拋出錯誤。與強制轉換不同的是,它不接受數字OID作為輸入。

大多數重構(反編譯)資料庫物件的函數都有一個可選的 pretty標誌,如果為true,結果將被“pretty-printed”。 美觀列印會抑制不必要的圓括弧,並為易讀性增加空格。 美觀列印的格式可讀性更好,但是預設格式更有可能被本資料庫的未來版本以同樣的方式解釋; 因此,避免為轉儲目的使用美觀列印的輸出。為pretty參數傳遞false會產生與省略參數相同的結果。

索引列屬性

名稱

描述

asc

在向前掃描時列是按照升序排列嗎?

desc

在向前掃描時列是按照降序排列嗎?

nulls_first

在向前掃描時列排序會把空值排在前面嗎?

nulls_last

在向前掃描時列排序會把空值排在最後嗎?

orderable

列具有已定義的排序次序嗎?

distance_orderable

列能否通過一個“distance”操作符(例如ORDER BY col <-> constant)有序地掃描?

returnable

列值是否可以通過一次只用索引掃描返回?

search_array

列是否天然支援col = ANY(array)搜尋?

search_nulls

列是否支援IS NULLIS NOT NULL搜尋?

索引性質

名稱

描述

clusterable

索引是否可以用於CLUSTER命令?

index_scan

索引是否支援普通掃描(非位元影像)?

bitmap_scan

索引是否支援位元影像掃描?

backward_scan

在掃描中掃描方向能否被更改(為了支援遊標上無需物化的FETCH BACKWARD)?

索引存取方法性質

名稱

描述

can_order

存取方法是否支援ASCDESC以及CREATE INDEX中的有關關鍵詞?

can_unique

存取方法是否支援唯一索引?

can_multi_col

存取方法是否支援多列索引?

can_exclude

存取方法是否支援排除約束?

can_include

存取方法是否支援CREATE INDEXINCLUDE子句?

對象資訊和定位函數表列出了與資料庫物件標識和定位有關的函數。

對象資訊和定位函數

pg_describe_object ( classid oid, objid oid, objsubid integer ) → text

返回由目錄OID、對象OID和子物件ID(例如表中的列號)標識的資料庫物件的文本描述;當引用整個對象時,子物件ID為0)。 這個描述是人類可讀的,並且可以根據伺服器配置進行翻譯。這對於決定pg_depend目錄中引用的對象的標識特別有用。

pg_identify_object ( classid oid, objid oid, objsubid integer ) → record ( type text, schema text, name text, identity text )

返回包含足夠資訊的行以唯一標識由目錄OID、對象OID和子物件ID指定的資料庫物件。 這些資訊是為了機器可讀的,永遠不會被翻譯。 type標識資料庫物件的類型; schema是對象所屬的模式名,NULL表示不屬於模式的物件類型; name是對象的名稱,如果有必要,用引號括起來,如果名稱(隨著模式名稱,如果相關)足以唯一地標識對象,否則為NULL; identity是完整的對象標識,其精確格式依賴於物件類型,格式中的每個名稱都是模式限定的,並在必要時用引號括起來。

pg_identify_object_as_address ( classid oid, objid oid, objsubid integer ) → record ( type text, object_names text[], object_args text[] )

返回包含足夠資訊的行以唯一標識由目錄OID、對象OID和子物件ID指定的資料庫物件。 返回的資訊獨立於當前伺服器,也就是說,它可以用於標識另一個伺服器中具有相同名稱的對象。 type標識資料庫物件的類型;object_namesobject_args是文本數組,它們一起構成對對象的引用。 這三個值可以傳遞給pg_get_object_address以獲得對象的內部地址。

pg_get_object_address ( type text, object_names text[], object_args text[] ) → record ( classid oid, objid oid, objsubid integer )

返回包含足夠資訊的行以唯一標識由類型代碼、對象名稱和參數數組指定的資料庫物件。 返回的值將在系統目錄中使用,例如pg_depend; 它們可以傳遞給其他系統函數,比如 pg_describe_objectpg_identify_objectclassid是包含該對象的系統目錄的OID;objid是對象本身的OID, objsubid是子物件的ID,如果沒有則為零。 這個函數是pg_identify_object_as_address的反向函數。

注釋資訊函數表中展示的函數抽取注釋,注釋是由COMMENT命令在以前儲存的。如果對指定參數找不到注釋,則返回空值。

注釋資訊函數

col_description ( table oid, column integer ) → text

返回表列的注釋,該注釋由該表的OID和列號指定。(obj_description不能用於表的列,因為列沒有自己的oid)。

obj_description ( object oid, catalog name ) → text

返回OID指定的資料庫物件的注釋和包含該對象的系統目錄的名稱。 例如,obj_description(123456, 'pg_class')將檢索OID為123456的表的注釋。

obj_description ( object oid ) → text

返回僅由其OID指定的資料庫物件的注釋。 這個已被用(deprecated)因為無法保證oid在不同的系統目錄中是唯一的;因此,可能會返回錯誤的注釋。

shobj_description ( object oid, catalog name ) → text

返回共用資料庫對象的注釋,該對象由其OID和包含的系統編目的名稱指定。 這與obj_description類似,只是它用於檢索共用對象(也就是資料庫、角色和資料表空間)上的注釋。 有些系統編目對每個叢集中的所有資料庫都是全域的,其中對象的描述也全域儲存。

事務ID和快照資訊功能表中展示的函數以一種可匯出的形式提供了伺服器事務資訊。 這些函數的主要用途是判斷在兩個快照之間哪些事務被提交。

事務ID和快照資訊功能

pg_current_xact_id () → xid8

返回當前事務的ID。如果當前事務還沒有一個ID(因為它還沒有執行任何資料庫更新),它將分配一個新的事務。

pg_current_xact_id_if_assigned () → xid8

返回當前事務的ID,如果還沒有分配ID則返回NULL。 (如果事務可能是唯讀,最好使用這種變體,以避免不必要地消耗XID)

pg_xact_status ( xid8 ) → text

報告最近的事務的提交狀態。如果事務為最近的,系統會保留事務的提交狀態,則結果是 in progresscommittedaborted。 如果該事務的時間足夠久,並且系統中沒有對該事務的引用,而且提交狀態資訊已經被丟棄,則結果為NULL。 應用可以使用此函數,例如,確定在進行COMMIT時,應用程式和資料庫伺服器中斷連線後,它們的事務是已提交還是中止。 注意,準備好的事務報告為in progress的事務;如果應用需要確定一個事務ID是否屬於一個準備好的事務,則必須檢查pg_prepared_xacts

pg_current_snapshot () → pg_snapshot

返回當前snapshot,顯示哪些事務IDs進行中中的資料結構。

pg_snapshot_xip ( pg_snapshot ) → setof xid8

返回快照中包含的進行中的事務IDs集。

pg_snapshot_xmax ( pg_snapshot ) → xid8

返回快照的xmax

pg_snapshot_xmin ( pg_snapshot ) → xid8

返回快照的xmin

pg_visible_in_snapshot ( xid8, pg_snapshot ) → boolean

根據此快照,給定的事務ID是否可見(visible)(也就是說,它是否在快照拍攝之前完成)? 注意,這個函數不會給出子事務ID的正確答案。

內部事務 ID 類型xid是 32 位寬的,可捆卷(wraps around)每 40 億個事務。 但是,事務 ID 和快照資訊功能表中所示的函數使用的是 64 位元類型的xid8,它在安裝過程中不捆卷(wraps around),如果需要,可以通過強制轉換將其轉換為xid。 資料類型pg_snapshot儲存特定時刻事務 ID 可見度的資訊。 其組成如快照組件表所描述。pg_snapshot的文本表示形式是xmin``:``xmax``:``xip_list。 例如10:20:10,14,15表示xmin=10, xmax=20, xip_list=10, 14, 15

快照組件

名稱

描述

xmin

仍然處於活動狀態的最低事務ID。所有小於xmin的事務IDs要麼提交且可見,要麼復原並死亡。

xmax

比最高完成的事務ID還高出一個值。所有大於或等於xmax的事務IDs到快照時還沒有完成,因此不可見。

xip_list

快照時進行中的事務。一個事務ID為xmin <= X < xmax且不在快照時已經完成的列表中,因此根據其提交狀態,該事務ID要麼是可見的,要麼是死的。此列表不包括子事務的事務IDs。

在本資料庫13以前的版本中,沒有xid8類型,因此提供了這些函數的變體,使用bigint表示64位 XID,並相應地提供不同的快照資料類型txid_snapshot。 這些舊的函數在它們的名字中有txid。 它們仍然支援向後相容性,但可能會從未來的版本中刪除。

已棄用的事務ID和快照資訊功能

txid_current () → bigint

參見 pg_current_xact_id().

txid_current_if_assigned () → bigint

參見 pg_current_xact_id_if_assigned().

txid_current_snapshot () → txid_snapshot

參見 pg_current_snapshot().

txid_snapshot_xip ( txid_snapshot ) → setof bigint

參見 pg_snapshot_xip().

txid_snapshot_xmax ( txid_snapshot ) → bigint

參見 pg_snapshot_xmax().

txid_snapshot_xmin ( txid_snapshot ) → bigint

參見 pg_snapshot_xmin().

txid_visible_in_snapshot ( bigint, txid_snapshot ) → boolean

參見 pg_visible_in_snapshot().

txid_status ( bigint ) → text

參見 pg_xact_status().

已提交事務資訊函數表中的函數提供了關於過去的事務何時被提交的資訊。 它們只在啟用 track_commit_timestamp 配置選項時提供有用的資料,並且只針對在啟用該選項後提交的事務。

已提交事務資訊函數

pg_xact_commit_timestamp ( xid ) → timestamp with time zone

返回事務的提交時間戳記。

pg_last_committed_xact () → record ( xid xid, timestamp timestamp with time zone )

返回最近提交的事務的事務ID和提交時間戳記。

控制資料函數表中所展示的函數能列印initdb期間初始化的資訊,例如目錄版本。 它們也能顯示有關預寫式日誌和檢查點處理的資訊。這些資訊是集簇範圍內的,不與任何特定的一個資料庫相關。 這些函數提供大致相同的資訊,對於同一種來源,就像pg_controldata應用。

控制資料函數

pg_control_checkpoint () → record

返回有關當前檢查點狀態的資訊。

pg_control_system () → record

返回有關當前控制檔案狀態的資訊。

pg_control_init () → record

返回有關叢集初始化狀態的資訊。

pg_control_recovery () → record

返回有關恢複狀態的資訊。

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

帶時區的時間戳記

pg_control_system 輸出資料行

列名稱

資料類型

pg_control_version

integer

catalog_version_no

integer

system_identifier

bigint

pg_control_last_modified

timestamp with time zone

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

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