PostgreSQL 系統(tǒng)信息函數(shù)和運算符

2021-08-27 10:55 更新

表 9.63展示了多個可以抽取會話和系統(tǒng)信息的函數(shù)。

除了本節(jié)列出的函數(shù),還有一些與統(tǒng)計系統(tǒng)相關(guān)的函數(shù)也提供系統(tǒng)信息。詳見第 27.2.2 節(jié)。

表 9.63. 會話信息函數(shù)

函數(shù)

描述

current_catalogname

current_database () → name

返回當(dāng)前數(shù)據(jù)庫的名稱。(在SQL標準中數(shù)據(jù)庫被稱為catalogs,因此current_catalog是該標準的拼寫方式。)

current_query () → text

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

current_rolename

這個等同于 current_user

current_schemaname

current_schema () → name

返回在搜索路徑中的第一個模式的名稱(如果搜索路徑為空則返回空值)。 這個模式將用于沒有指定目標模式就創(chuàng)建的任何表或其他已命名對象。

current_schemas ( include_implicit boolean ) → name[]

返回當(dāng)前在有效搜索路徑中的所有模式的名稱的數(shù)組,以優(yōu)先級順序。 (當(dāng)前 search_path設(shè)置中與已存在的、可搜索模式不相符的項將被省略。) 如果布爾參數(shù)為true,則類似pg_catalog的隱式搜索的系統(tǒng)模式將包含在結(jié)果中。

current_username

返回當(dāng)前執(zhí)行上下文的用戶名。

inet_client_addr () → inet

返回當(dāng)前客戶端的IP地址,如果當(dāng)前連接是通過Unix-域套接字則返回NULL

inet_client_port () → integer

返回當(dāng)前客戶端的IP端口號,如果當(dāng)前連接是通過Unix-域套接字則返回NULL。

inet_server_addr () → inet

返回服務(wù)器接受當(dāng)前連接的IP地址,如果當(dāng)前連接是通過Unix-域套接字則返回NULL。

inet_server_port () → integer

返回服務(wù)器接受當(dāng)前連接的IP端口號,如果當(dāng)前連接是通過Unix-域套接字則返回NULL。

pg_backend_pid () → integer

返回附加到當(dāng)前會話的服務(wù)器進程的進程ID。

pg_blocking_pids ( integer ) → integer[]

返回阻止服務(wù)器進程的會話的進程ID數(shù)組,該進程ID與指定的進程ID一起獲取鎖定,如果沒有這樣的服務(wù)器進程或者沒有被阻塞,則返回一個空數(shù)組。

如果一個服務(wù)器進程持有一個與被阻塞進程的鎖請求沖突的鎖(硬阻塞),或者正在等待一個與被阻塞進程的鎖請求沖突并且在等待隊列中位于其前面的鎖(軟阻塞),那么這個服務(wù)器進程就會阻塞另一個服務(wù)器進程。 當(dāng)使用并行查詢時結(jié)果總是列出客戶端可見的進程ID(即pg_backend_pid的結(jié)果),即使實際的鎖是由子工作進程持有或等待的。 因此,結(jié)果中可能存在重復(fù)的pid。還要注意當(dāng)準備好的事務(wù)持有沖突鎖時,它將用零進程ID表示。

頻繁調(diào)用這個函數(shù)可能會對數(shù)據(jù)庫性能產(chǎn)生一些影響,因為它需要在短時間內(nèi)獨占訪問鎖管理器的共享狀態(tài)。

pg_conf_load_time () → timestamp with time zone

返回服務(wù)器配置文件最后加載的時間。如果當(dāng)前會話當(dāng)時是活躍的,那么這將是會話本身重新讀取配置文件的時間(因此在不同的會話中讀取會稍有不同)。 否則,就是postmaster進程重新讀取配置文件的時間。

pg_current_logfile ( [ text ] ) → text

返回日志采集器當(dāng)前使用的日志文件的路徑名。該路徑包括log_directory目錄和單個日志文件名。 如果日志采集器被禁用,結(jié)果為NULL。當(dāng)存在多個日志文件時,每個文件的格式都不同,不帶參數(shù)的pg_current_logfile將返回在有序列表中找到的第一種格式的文件路徑: stderrcsvlog。 如果沒有日志文件具有任何這些格式,則返回NULL。 要請求關(guān)于特定日志文件格式的信息,可以提供 csvlogstderr作為可選參數(shù)的值。 如果在log_destination中沒有配置需要的日志格式,則結(jié)果為 NULL。 結(jié)果反映了current_logfiles文件的內(nèi)容。

pg_my_temp_schema () → oid

返回當(dāng)前會話的臨時模式的OID,如果沒有則返回0(因為它沒有創(chuàng)建任何臨時表)。

pg_is_other_temp_schema ( oid ) → boolean

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

pg_jit_available () → boolean

如果JIT編譯器擴展可用(參見第 31 章),并且jit配置參數(shù)設(shè)置為on,則返回真。

pg_listening_channels () → setof text

返回當(dāng)前會話正在偵聽的異步通知通道的名稱集。

pg_notification_queue_usage () → double precision

返回當(dāng)前被等待處理的通知所占用的異步通知隊列最大尺寸的分數(shù)(0–1)。更多信息請參見LISTENNOTIFY

pg_postmaster_start_time () → timestamp with time zone

返回服務(wù)器啟動時的時間。

pg_safe_snapshot_blocking_pids ( integer ) → integer[]

返回一個進程ID數(shù)組,該進程ID是阻塞服務(wù)器進程獲取安全快照的會話的進程ID數(shù)組,如果沒有這樣的服務(wù)器進程或者沒有阻塞,則返回一個空數(shù)組。

運行SERIALIZABLE事務(wù)的會話會阻止SERIALIZABLE READ ONLY DEFERRABLE事務(wù)獲取快照,直到后者確定可以安全地避免獲取謂詞鎖。 關(guān)于可序列化和可延遲事務(wù)的更多信息,請參見第 13.2.3 節(jié)。

頻繁調(diào)用這個函數(shù)可能會對數(shù)據(jù)庫性能產(chǎn)生一些影響,因為它需要在短時間內(nèi)訪問謂詞鎖管理器的共享狀態(tài)。

pg_trigger_depth () → integer

返回當(dāng)前嵌套層次的PostgreSQL觸發(fā)器(如果沒有調(diào)用則為 0,直接或間接,從一個觸發(fā)器內(nèi)部開始)。

session_username

返回會話用戶名.

username

這個相當(dāng)于 current_user。

version () → text

返回描述PostgreSQL服務(wù)器的版本的字符串。 你還可以從 server_version中獲得此信息,或者對于機器可讀的版本,使用server_version_num。 軟件開發(fā)人員可以使用server_version_num(從8.2起可用)或PQserverVersion,而不是解析文本版本。


注意

current_catalogcurrent_role、current_schema、current_user、session_useruserSQL里有特殊的語意狀態(tài): 它們被調(diào)用時結(jié)尾不要跟著園括號。 在 PostgreSQL 中,圓括號可以有選擇性地被用于current_schema,但是不能和其他的一起用。

session_user通常是發(fā)起當(dāng)前數(shù)據(jù)庫連接的用戶,不過超級用戶可以用SET SESSION AUTHORIZATION修改這個設(shè)置。 current_user是用于權(quán)限檢查的用戶標識。通常, 它總是等于會話用戶,但是可以被SET ROLE改變。 它也會在函數(shù)執(zhí)行的過程中隨著屬性SECURITY DEFINER的改變而改變。 在 Unix 的說法里,那么會話用戶是真實用戶,而當(dāng)前用戶是 有效用戶。 current_role以及usercurrent_user的同義詞(SQL標準在current_rolecurrent_user之間做了區(qū)分,但 PostgreSQL不區(qū)分,因為它把用戶和角色統(tǒng)一成了一種實體)。

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

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

表 9.64. 訪問權(quán)限查詢函數(shù)

函數(shù)

描述

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

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

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

用戶對指定的表列有特權(quán)么?如果對整個表持有特權(quán),或者對列授予了列級別的特權(quán),則會成功。 可以通過名稱或?qū)傩跃幪?pg_attribute.attnum)指定列。 允許的特權(quán)類型為SELECT, INSERT,UPDATE, 和 REFERENCES。

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

用戶對數(shù)據(jù)庫有特權(quán)嗎?允許的特權(quán)類型為CREATE,CONNECT,TEMPORARY, 和TEMP (相當(dāng)于 TEMPORARY)。

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

用戶是否擁有外部數(shù)據(jù)包裝的特權(quán)?唯一允許的特權(quán)類型是USAGE

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

用戶對函數(shù)有特權(quán)嗎?唯一允許的特權(quán)類型是EXECUTE。

當(dāng)通過名稱而不是OID指定函數(shù)時,允許的輸入與regprocedure數(shù)據(jù)類型相同(參見第 8.19 節(jié))。一個例子為:

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

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

用戶對語言有特權(quán)嗎?唯一允許的特權(quán)類型是USAGE。

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

用戶對模式有特權(quán)嗎?允許的特權(quán)類型是CREATEUSAGE

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

用戶是否有順序特權(quán)?允許的特權(quán)類型有USAGE, SELECT, 和UPDATE。

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

用戶是否對外部服務(wù)器有特權(quán)?唯一允許的特權(quán)類型是USAGE

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

用戶對表有特權(quán)嗎?允許的特權(quán)類型有SELECT, INSERT,UPDATE, DELETE,TRUNCATE, REFERENCES,和 TRIGGER。

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

用戶對表空間有特權(quán)嗎?唯一允許的特權(quán)類型是CREATE。

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

用戶對數(shù)據(jù)類型有特權(quán)嗎?唯一允許的特權(quán)類型是 USAGE。 當(dāng)通過名稱而不是OID指定類型時,允許的輸入與regtype數(shù)據(jù)類型相同(參見第 8.19 節(jié))。

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

用戶對角色有特權(quán)么?允許的特權(quán)類型是MEMBERUSAGEMEMBER表示角色中的直接或間接成員關(guān)系(即執(zhí)行SET ROLE的權(quán)利),而USAGE表示不執(zhí)行SET ROLE情況下是否立即可用角色的特權(quán)。 此函數(shù)不允許特殊情況下將user設(shè)置為public,因為PUBLIC偽角色永遠不能成為真實角色的成員。

row_security_active ( table text or oid ) → boolean

在當(dāng)前用戶和當(dāng)前環(huán)境的上下文之中,指定表的行級安全是活動的嗎?


表 9.65 顯示了aclitem類型的可用操作符,它是訪問權(quán)限的目錄表示。 有關(guān)如何讀取訪問權(quán)限值的信息,請參閱 第 5.7 節(jié)。

表 9.65. aclitem 操作符

操作符

描述

例子

aclitem = aclitemboolean

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

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

aclitem[] @> aclitemboolean

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

'{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


表 9.66 顯示了一些額外的函數(shù)來管理aclitem類型。

表 9.66. aclitem 函數(shù)

函數(shù)

描述

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

構(gòu)造一個aclitem數(shù)組,該數(shù)組持有type類型對象的默認訪問特權(quán),該對象屬于OID為ownerId的角色。 這表示當(dāng)對象的ACL條目為空時所假定的訪問特權(quán)。(默認的訪問特權(quán)在第 5.7 節(jié)中描述。) type 參數(shù)必須是下列中的一個 'c' 對應(yīng) COLUMN, 'r' 對應(yīng) TABLE 和類表對象, 's' 對應(yīng) SEQUENCE, 'd' 對應(yīng) DATABASE, 'f' 對應(yīng) FUNCTIONPROCEDURE, 'l' 對應(yīng) LANGUAGE, 'L' 對應(yīng) LARGE OBJECT, 'n' 對應(yīng) SCHEMA, 't' 對應(yīng) TABLESPACE, 'F' 對應(yīng) FOREIGN DATA WRAPPER, 'S' 對應(yīng) FOREIGN SERVER,或 'T' 對應(yīng) TYPEDOMAIN.

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

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

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

使用給定的屬性構(gòu)造 aclitem 。


表 9.67展示了決定是否一個特定對象在當(dāng)前模式搜索路徑中可見的函數(shù)。 例如,如果一個表所在的模式在當(dāng)前搜索路徑中并且在它之前沒有出現(xiàn)過相同的名字,這個表就被說是可見的。 這等價于在語句中表可以被用名稱引用但不加顯式的模式限定。因此,要列出所有可見表的名字:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

對于函數(shù)和操作符,如果路徑前面沒有相同名稱and argument data type(s)的對象,那么搜索路徑中的對象就是可見的。 對于操作符類和操作符族,要考慮名稱和關(guān)聯(lián)的索引訪問方法。

表 9.67. 模式可見性查詢函數(shù)

函數(shù)

描述

pg_collation_is_visible ( collation oid ) → boolean

排序規(guī)則在搜索路徑中可見嗎?

pg_conversion_is_visible ( conversion oid ) → boolean

轉(zhuǎn)換在搜索路徑中可見嗎?

pg_function_is_visible ( function oid ) → boolean

函數(shù)在搜索路徑中可見嗎?(這也適用于過程和聚合。)

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

統(tǒng)計對象在搜索路徑中可見嗎?

pg_table_is_visible ( table oid ) → boolean

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

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

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


所有這些函數(shù)都要求用對象 OID 來標識將被檢查的對象。如果你想用名稱來測試一個對象,使用 OID 別名類型(regclass、regtype、regprocedure、regoperator、regconfigregdictionary)將會很方便。例如:

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

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

表 9.68 列出從系統(tǒng)目錄中提取信息的函數(shù)。

表 9.68. 系統(tǒng)目錄信息函數(shù)

函數(shù)

描述

format_type ( type oid, typemod integer ) → text

返回由其類型OID和可能的類型修飾符標識的數(shù)據(jù)類型的SQL名稱。如果沒有已知的類型修飾符,則傳遞NULL值給類型修飾符。

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

重構(gòu)為了約束的創(chuàng)建命令。(這是一個反編譯的重構(gòu),而不是命令的原始文本。)

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

反編譯存儲在系統(tǒng)目錄中的表達式的內(nèi)部形式,例如列的默認值。 如果表達式可能包含變量,則指定它們所指向的關(guān)系的OID作為第二個參數(shù);如果沒有預(yù)期的變量,傳遞0就可以了。

pg_get_functiondef ( func oid ) → text

重構(gòu)為了函數(shù)或過程的創(chuàng)建命令。(這是一個反編譯的重構(gòu),而不是命令的原始文本。) 結(jié)果是一個完整的CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE語句。

pg_get_function_arguments ( func oid ) → text

重新構(gòu)造函數(shù)或過程的參數(shù)列表,以其在 CREATE FUNCTION里面需要出現(xiàn)的形式(包括默認值)。

pg_get_function_identity_arguments ( func oid ) → text

重新構(gòu)造標識函數(shù)或過程所需的參數(shù)列表,以其應(yīng)出現(xiàn)在ALTER FUNCTION等命令中的形式。這個表單省略默認值。

pg_get_function_result ( func oid ) → text

重構(gòu)函數(shù)的RETURNS子句,以其需要出現(xiàn)在CREATE FUNCTION中的形式。對于過程,返回NULL

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

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

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

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

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

重構(gòu)針對規(guī)則的創(chuàng)建命令。(這是一個反編譯的重構(gòu),而不是命令的原始文本。)

pg_get_serial_sequence ( table text, column text ) → text

返回與列相關(guān)聯(lián)的序列名稱,如果沒有序列與該列相關(guān)聯(lián)則返回NULL。 如果列是標識列,則關(guān)聯(lián)序列是在內(nèi)部為該列創(chuàng)建的序列。 對于使用一種串行類型(serial, smallserial, bigserial)創(chuàng)建的列,它是為該串行列定義創(chuàng)建的序列。 在后一種情況下,可以使用ALTER SEQUENCE OWNED BY修改或刪除關(guān)聯(lián)。 (這個函數(shù)可能應(yīng)該被稱為pg_get_owned_sequence;它的當(dāng)前名稱反映了它在歷史上曾與串行類型的列一起使用。) 第一個參數(shù)是具有可選模式的表名,第二個參數(shù)是列名。 由于第一個參數(shù)可能包含模式名和表名,因此按照通常的SQL規(guī)則解析它,這意味著默認情況下它是小寫的。 第二個參數(shù)只是一個列名,按照字面來處理,因此保留了它的大小寫。結(jié)果經(jīng)過了適當(dāng)?shù)母袷交?,可以傳遞給序列函數(shù)(參見第 9.17 節(jié))。

典型的用法是讀取序列的當(dāng)前值以獲取標識或串行列,示例如下:

SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_statisticsobjdef ( statobj oid ) → text

重構(gòu)針對擴展統(tǒng)計對象的創(chuàng)建命令。(這是一個反編譯的重構(gòu),而不是命令的原始文本。)

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

重構(gòu)針對觸發(fā)器的創(chuàng)建命令。(這是一個反編譯的重構(gòu),而不是命令的原始文本。)

pg_get_userbyid ( role oid ) → name

根據(jù)OID返回角色名。

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

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

pg_get_viewdef ( view oid, wrap_column integer ) → text

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

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

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

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

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

pg_index_has_property ( index regclass, property text ) → boolean

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

pg_indexam_has_property ( am oid, property text ) → boolean

測試索引訪問方法是否具有命名屬性。訪問方法屬性如表 9.71所示。 如果屬性名未知或不適用于特定對象,或者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

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

pg_tablespace_location ( tablespace oid ) → text

返回表空間所在的文件系統(tǒng)路徑。

pg_typeof ( "any" ) → regtype

返回傳遞值給它的數(shù)據(jù)類型的OID。這對于故障排除或動態(tài)構(gòu)造SQL查詢很有幫助。 函數(shù)聲明為返回regtype,它是一個OID別名類型(see 第 8.19 節(jié)); 這意味著,為了比較,它與OID相同,但顯示為類型名。

例如:

SELECT pg_typeof(33);
 pg_typeof
-----------
 integer

SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
 typlen
--------
      4

COLLATION FOR ( "any" ) → text

返回傳遞值給它的排序規(guī)則的名稱。如果需要,該值會被引號括起來,并使用模式限定。 如果沒有為參數(shù)表達式派生排序規(guī)則,則返回NULL。如果參數(shù)不是可排序數(shù)據(jù)類型,則會引發(fā)錯誤。

例如:

SELECT collation for (description) FROM pg_description LIMIT 1;
 pg_collation_for
------------------
 "default"

SELECT collation for ('foo' COLLATE "de_DE");
 pg_collation_for
------------------
 "de_DE"

to_regclass ( text ) → regclass

將文本關(guān)系名轉(zhuǎn)換為它的OID。通過將字符串類型轉(zhuǎn)換為regclass可以得到類似的結(jié)果(參見第 8.19 節(jié)); 但是,如果沒有找到名稱,這個函數(shù)將返回NULL而不會拋出錯誤。與強制轉(zhuǎn)換不同的是,它不接受數(shù)字OID作為輸入。

to_regcollation ( text ) → regcollation

將文本排序規(guī)則名稱轉(zhuǎn)換為它的OID。通過將字符串類型轉(zhuǎn)換為regcollation(參見第 8.19 節(jié))可以得到類似的結(jié)果; 但是,如果沒有找到名稱,這個函數(shù)將返回NULL而不會拋出錯誤。與強制轉(zhuǎn)換不同的是,它不接受數(shù)字OID作為輸入。

to_regnamespace ( text ) → regnamespace

將文本模式名轉(zhuǎn)換為它的OID。通過將字符串轉(zhuǎn)換為regnamespace類型(參見第 8.19 節(jié))可以得到類似的結(jié)果; 但是,如果沒有找到名稱,這個函數(shù)將返回NULL而不會拋出錯誤。與強制轉(zhuǎn)換不同的是,它不接受數(shù)字OID作為輸入。

to_regoper ( text ) → regoper

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

to_regoperator ( text ) → regoperator

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

to_regproc ( text ) → regproc

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

to_regprocedure ( text ) → regprocedure

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

to_regrole ( text ) → regrole

將文本角色名轉(zhuǎn)換為它的OID。通過將字符串類型轉(zhuǎn)換為regrole可以得到類似的結(jié)果(參見第 8.19 節(jié)); 但是,如果沒有找到名稱,這個函數(shù)將返回NULL而不會拋出錯誤。與強制轉(zhuǎn)換不同的是,它不接受數(shù)字OID作為輸入。

to_regtype ( text ) → regtype

將文本類型名轉(zhuǎn)換為它的OID。通過將字符串類型轉(zhuǎn)換為regtype可以得到類似的結(jié)果(參見第 8.19 節(jié)); 但是,如果沒有找到名稱,這個函數(shù)將返回NULL而不會拋出錯誤。與強制轉(zhuǎn)換不同的是,它不接受數(shù)字OID作為輸入。


大多數(shù)重構(gòu)(反編譯)數(shù)據(jù)庫對象的函數(shù)都有一個可選的 pretty標志,如果為true,結(jié)果將被pretty-printed。 美觀打印會抑制不必要的圓括號,并為易讀性增加空格。 美觀打印的格式可讀性更好,但是默認格式更有可能被PostgreSQL的未來版本以同樣的方式解釋; 因此,避免為轉(zhuǎn)儲目的使用美觀打印的輸出。為pretty參數(shù)傳遞false會產(chǎn)生與省略參數(shù)相同的結(jié)果。

表 9.69. 索引列屬性

名稱 描述
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搜索?

表 9.70. 索引性質(zhì)

名稱 描述
clusterable 索引是否可以用于CLUSTER命令?
index_scan 索引是否支持普通掃描(非位圖)?
bitmap_scan 索引是否支持位圖掃描?
backward_scan 在掃描中掃描方向能否被更改(為了支持游標上無需物化的FETCH BACKWARD)?

表 9.71. 索引訪問方法性質(zhì)

名稱 描述
can_order 訪問方法是否支持ASC、DESC以及CREATE INDEX中的有關(guān)關(guān)鍵詞?
can_unique 訪問方法是否支持唯一索引?
can_multi_col 訪問方法是否支持多列索引?
can_exclude 訪問方法是否支持排除約束?
can_include 訪問方法是否支持CREATE INDEXINCLUDE子句?

表 9.72列出了與數(shù)據(jù)庫對象 標識和定位有關(guān)的函數(shù)。

表 9.72. 對象信息和定位函數(shù)

函數(shù)

描述

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

返回由目錄OID、對象OID和子對象ID(例如表中的列號)標識的數(shù)據(jù)庫對象的文本描述;當(dāng)引用整個對象時,子對象ID為0)。 這個描述是人類可讀的,并且可以根據(jù)服務(wù)器配置進行翻譯。這對于決定pg_depend目錄中引用的對象的標識特別有用。

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

返回包含足夠信息的行以唯一標識由目錄OID、對象OID和子對象ID指定的數(shù)據(jù)庫對象。 這些信息是為了機器可讀的,永遠不會被翻譯。 type標識數(shù)據(jù)庫對象的類型; schema是對象所屬的模式名,NULL表示不屬于模式的對象類型; name是對象的名稱,如果有必要,用引號括起來,如果名稱(隨著模式名稱,如果相關(guān))足以唯一地標識對象,否則為 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指定的數(shù)據(jù)庫對象。 返回的信息獨立于當(dāng)前服務(wù)器,也就是說,它可以用于標識另一個服務(wù)器中具有相同名稱的對象。 type標識數(shù)據(jù)庫對象的類型;object_namesobject_args是文本數(shù)組,它們一起構(gòu)成對對象的引用。 這三個值可以傳遞給pg_get_object_address以獲得對象的內(nèi)部地址。

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

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


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

表 9.73. 注釋信息函數(shù)

函數(shù)

描述

col_description ( table oid, column integer ) → text

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

obj_description ( object oid, catalog name ) → text

返回OID指定的數(shù)據(jù)庫對象的注釋和包含該對象的系統(tǒng)目錄的名稱。 例如,obj_description(123456, 'pg_class')將檢索OID為123456的表的注釋。

obj_description ( object oid ) → text

返回僅由其OID指定的數(shù)據(jù)庫對象的注釋。 這個已被棄用(deprecated)因為無法保證oid在不同的系統(tǒng)目錄中是唯一的;因此,可能會返回錯誤的注釋。

shobj_description ( object oid, catalog name ) → text

返回共享數(shù)據(jù)庫對象的注釋,該對象由其OID和包含的系統(tǒng)編目的名稱指定。 這與obj_description類似,只是它用于檢索共享對象(也就是數(shù)據(jù)庫、角色和表空間)上的注釋。 有些系統(tǒng)編目對每個集群中的所有數(shù)據(jù)庫都是全局的,其中對象的描述也全局存儲。


表 9.74中展示的函數(shù)以一種可導(dǎo)出的形式提供了服務(wù)器事務(wù)信息。 這些函數(shù)的主要用途是判斷在兩個快照之間哪些事務(wù)被提交。

表 9.74. 事務(wù)ID和快照信息功能

函數(shù)

描述

pg_current_xact_id () → xid8

返回當(dāng)前事務(wù)的ID。如果當(dāng)前事務(wù)還沒有一個ID(因為它還沒有執(zhí)行任何數(shù)據(jù)庫更新),它將分配一個新的事務(wù)。

pg_current_xact_id_if_assigned () → xid8

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

pg_xact_status ( xid8 ) → text

報告最近的事務(wù)的提交狀態(tài)。如果事務(wù)為最近的,系統(tǒng)會保留事務(wù)的提交狀態(tài),則結(jié)果是 in progresscommittedaborted。 如果該事務(wù)的時間足夠久,并且系統(tǒng)中沒有對該事務(wù)的引用,而且提交狀態(tài)信息已經(jīng)被丟棄,則結(jié)果為NULL。 應(yīng)用可以使用此函數(shù),例如,確定在進行 COMMIT時,應(yīng)用程序和數(shù)據(jù)庫服務(wù)器斷開連接后,它們的事務(wù)是已提交還是中止。 注意,準備好的事務(wù)報告為in progress的事務(wù);如果應(yīng)用需要確定一個事務(wù)ID是否屬于一個準備好的事務(wù),則必須檢查pg_prepared_xacts。

pg_current_snapshot () → pg_snapshot

返回當(dāng)前snapshot,顯示哪些事務(wù)IDs正在進行中的數(shù)據(jù)結(jié)構(gòu)。

pg_snapshot_xip ( pg_snapshot ) → setof xid8

返回快照中包含的正在進行的事務(wù)IDs集。

pg_snapshot_xmax ( pg_snapshot ) → xid8

返回快照的xmax。

pg_snapshot_xmin ( pg_snapshot ) → xid8

返回快照的xmin。

pg_visible_in_snapshot ( xid8, pg_snapshot ) → boolean

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


內(nèi)部事務(wù)ID類型xid是32位寬的,可捆卷(wraps around)每40億個事務(wù)。 但是,表 9.74中所示的函數(shù)使用的是64位類型的xid8,它在安裝過程中不捆卷(wraps around),如果需要,可以通過強制轉(zhuǎn)換將其轉(zhuǎn)換為xid。 數(shù)據(jù)類型pg_snapshot存儲特定時刻事務(wù)ID可見性的信息。 其組成如表 9.75所描述。pg_snapshot的文本表示形式是 xmin:xmax:xip_list 。 例如10:20:10,14,15表示xmin=10, xmax=20, xip_list=10, 14, 15。

表 9.75. 快照組件

名稱 描述
xmin 仍然處于活動狀態(tài)的最低事務(wù)ID。所有小于xmin的事務(wù)IDs要么提交且可見,要么回滾并死亡。
xmax 比最高完成的事務(wù)ID還高出一個值。所有大于或等于xmax的事務(wù)IDs到快照時還沒有完成,因此不可見。
xip_list 快照時正在進行的事務(wù)。一個事務(wù)ID為xmin <= X < xmax且不在快照時已經(jīng)完成的列表中,因此根據(jù)其提交狀態(tài),該事務(wù)ID要么是可見的,要么是死的。此列表不包括子事務(wù)的事務(wù)IDs。

PostgreSQL13以前的版本中,沒有xid8類型,因此提供了這些函數(shù)的變體,使用bigint表示64位XID,并相應(yīng)地提供不同的快照數(shù)據(jù)類型txid_snapshot。 這些舊的函數(shù)在它們的名字中有txid。 它們?nèi)匀恢С窒蚝蠹嫒菪?,但可能會從未來的版本中刪除。參見 表 9.76。

表 9.76. 已棄用的事務(wù)ID和快照信息功能

函數(shù)

描述

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().


表 9.77中的函數(shù)提供了關(guān)于過去的事務(wù)何時被提交的信息。 它們只在啟用track_commit_timestamp配置選項時提供有用的數(shù)據(jù),并且只針對在啟用該選項后提交的事務(wù)。

表 9.77. 已提交事務(wù)信息函數(shù)

函數(shù)

描述

pg_xact_commit_timestamp ( xid ) → timestamp with time zone

返回事務(wù)的提交時間戳。

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

返回最近提交的事務(wù)的事務(wù)ID和提交時間戳。


表 9.78中所展示的函數(shù)能打印initdb期間初始化的信息,例如目錄版本。 它們也能顯示有關(guān)預(yù)寫式日志和檢查點處理的信息。這些信息是集簇范圍內(nèi)的,不與任何特定的一個數(shù)據(jù)庫相關(guān)。 這些函數(shù)提供大致相同的信息,對于同一種來源,就像 pg_controldata 應(yīng)用。

表 9.78. 控制數(shù)據(jù)函數(shù)

函數(shù)

描述

pg_control_checkpoint () → record

返回有關(guān)當(dāng)前檢查點狀態(tài)的信息, 如 表 9.79所展示。

pg_control_system () → record

返回有關(guān)當(dāng)前控制文件狀態(tài)的信息,如 表 9.80 所展示。

pg_control_init () → record

返回有關(guān)集群初始化狀態(tài)的信息,如 表 9.81所展示。

pg_control_recovery () → record

返回有關(guān)恢復(fù)狀態(tài)的信息,如 表 9.82所展示。


表 9.79. pg_control_checkpoint 輸出列

列名稱 數(shù)據(jù)類型
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 帶時區(qū)的時間戳

表 9.80. pg_control_system 輸出列

列名稱 數(shù)據(jù)類型
pg_control_version integer
catalog_version_no integer
system_identifier bigint
pg_control_last_modified timestamp with time zone

表 9.81. pg_control_init 輸出列

列名稱 數(shù)據(jù)類型
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.82. pg_control_recovery 輸出列

列名稱 數(shù)據(jù)類型
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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號