Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.27. 系统的信息功能和操作符 #

9.27.1. 会话信息函数
9.27.2. 访问权限查询函数
9.27.3. 模式可见性查询函数
9.27.4. 系统目录信息函数
9.27.5. 对象信息和寻址函数
9.27.6. 注释信息函数
9.27.7. 数据有效性检查函数
9.27.8. 事务 ID 和快照信息函数
9.27.9. 已提交事务信息函数
9.27.10. 控制数据函数
9.27.11. 版本信息函数
9.27.12. WAL 汇总信息函数

本节描述的功能用于获取关于 PostgreSQL 安装的各种信息。

9.27.1. 会话信息函数 #

表 9.69 显示了几个提取会话和系统信息的函数。

除本节中列出的函数外,还有一系列与统计系统相关的函数,也提供系统信息。有关更多信息,请参见第 27.2.26 节

表 9.69. 会话信息函数

函数

说明

current_catalogname

current_database () → name

返回当前数据库的名称。(在 SQL 标准中将数据库称为“目录”,因此 current_catalog 是标准拼写方式。)

current_query () → text

返回当前执行查询的文本,如客户端提交时所示(可能包含多个语句)。

current_rolename

这相当于 current_user

current_schemaname

current_schema () → name

返回在搜索路径中位于第一位的架构的名称(如果搜索路径为空,则返回 null 值)。这是在未指定目标架构的情况下创建的任何表或其他命名对象的架构。

current_schemas ( include_implicit boolean ) → name[]

返回有效搜索路径中所有架构名称的数组,按其优先顺序排列。(当前 search_path 设置中与未搜索或可搜索的架构不对应的项将被省略。)如果布尔参数为 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

返回服务器配置文件上次加载时的时间。如果当前会话当时处于活动状态,这将是会话本身重新读取配置文件的时间(因此读取将在不同的会话中略有不同)。否则,这是后主进程重新读取配置文件的时间。

pg_current_logfile ( [ text ] ) → text

返回记录收集器当前使用的日志文件的路径名。此路径包括 log_directory 目录和各个日志文件的名称。如果记录收集器禁用,结果为 NULL。当有多个日志文件存在且各采用不同格式时,不带参数的 pg_current_logfile 返回其格式在有序列表中首先出现的日志文件的路径:stderrcsvlogjsonlog。如果任何日志文件都不采用这些格式,则返回 NULL。若要请求有关特定日志文件格式的信息,请将 csvlogjsonlogstderr 作为可选参数的值。如果请求的日志格式未在 log_destination 中进行配置,结果为 NULL。结果反映了 current_logfiles 文件的内容。

默认情况下,此函数仅限于超级用户和具有 pg_monitor 角色的权限的角色,但可授予其他用户 EXECUTE 权限以运行此函数。

pg_my_temp_schema () → oid

返回当前会话的临时模式的 OID,如果该会话没有临时模式,则返回零(因为它没有创建任何临时表)。

pg_is_other_temp_schema ( oid ) → boolean

如果给定的 OID 是另一个会话的临时模式的 OID,则返回 true。(例如,这可能有助于从目录显示中排除其他会话的临时表。)

pg_jit_available () → boolean

返回 true,如果JIT编译器扩展可用(参见 第 30 章),并且 jit 配置参数已设置为 on

pg_listening_channels () → setof text

返回一个异步通知通道集合的名称,当前会话监听这些通道。

pg_notification_queue_usage() → double precision

返回当前由等待处理的通知占用的异步通知队列最大大小的各部分 (0-1)。有关详细信息,请参阅LISTENNOTIFY

pg_postmaster_start_time () → timestamp with time zone

返回服务器开始运行的时间。

pg_safe_snapshot_blocking_pids ( integer ) → integer[]

返回具有指定进程 ID 的进程 ID 数组,该进程 ID 阻止了服务器进程获取安全快照,或者如果不存在此类服务器进程或该进程未被阻塞,则返回一个空数组。

正在运行 SERIALIZABLE 事务的会话会阻止 SERIALIZABLE READ ONLY DEFERRABLE 事务获取快照,直到后者确定可以避免获取任何谓词锁为止。有关可串行化和可延迟事务的详细信息,请参阅第 13.2.3 节

频繁调用此函数可能会对数据库性能产生一些影响,因为它需要在短时间内访问谓词锁管理器的共享状态。

pg_trigger_depth () → integer

返回 PostgreSQL 触发器的当前嵌套级别(如果未直接或间接从触发器内部调用,则为 0)。

session_username

返回会话用户的名称。

system_usertext

返回身份验证方法和用户在分配数据库角色之前在身份验证周期中提供的身份(如果存在)。它表示为 auth_method:identityNULL(如果用户未经身份验证(例如已使用 信任身份验证)。

username

这相当于 current_user


注意

current_catalogcurrent_rolecurrent_schemacurrent_usersession_useruserSQL中具有特殊的语法状态:必须在没有尾随括号的情况下调用它们。在 PostgreSQL 中,括号可以选择与 current_schema 一起使用,但不能与其他函数一起使用。

通常,session_user 是启动当前数据库连接的用户;但超级用户可用 SET SESSION AUTHORIZATION更改此设置。current_user 适用于权限检查的用户标识符。它通常等于会话用户,但可用 SET ROLE更改它。它在执行属性为 SECURITY DEFINER 的函数时也会发生改变。用 Unix 术语来说,会话用户是 real user,而当前用户是 effective usercurrent_roleusercurrent_user 的同义词。(SQL 标准将 current_rolecurrent_user 区分开来,但 PostgreSQL 不这样做,因为它将用户和角色统一为一个类别的实体。)

9.27.2. 访问权限查询函数 #

表 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. 访问权限查询函数

函数

说明

has_any_column_privilege ( [ user nameoid, ] table textoid, privilege text ) → boolean

用户是否对表中有任何列特权?这在拥有整个表的特权或至少为一列授予列级特权时才成功。允许的特权类型包括 SELECTINSERTUPDATEREFERENCES

has_column_privilege ( [ user nameoid, ] table textoid, column textsmallint, privilege text ) → boolean

用户是否对指定表列有特权?这在拥有整个表的特权或为该列授予列级特权时才成功。列可通过名称或属性号指定 (pg_attribute.attnum)。允许的特权类型包括 SELECTINSERTUPDATEREFERENCES

has_database_privilege ( [ user nameoid, ] database textoid, privilege text ) → boolean

用户是否对数据库有特权?允许的特权类型包括 CREATECONNECTTEMPORARYTEMP(相当于 TEMPORARY)。

has_foreign_data_wrapper_privilege ( [ user nameoid, ] fdw textoid, privilege text ) → boolean

用户是否对外部数据封装有特权?唯一允许的特权类型为 USAGE

has_function_privilege ( [ user 名称oid, ] function 文本oid, privilege 文本 ) → 布尔值

用户是否拥有对函数的权限?唯一允许的权限类型是 EXECUTE

按名称而不是按 OID 指定函数时,允许的输入与 regprocedure 数据类型相同(请参见第 8.19 节)。一个示例为

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

has_language_privilege ( [ user 名称oid, ] language 文本oid, privilege 文本 ) → 布尔值

用户是否拥有该语言的权限?唯一允许的权限类型是 USAGE

has_parameter_privilege ( [ user 名称oid, ] parameter 文本, privilege 文本 ) → 布尔值

用户是否拥有配置文件参数权限?参数名称不区分大小写。允许的权限类型是 SETALTER SYSTEM

has_schema_privilege ( [ user 名称oid, ] schema 文本oid, privilege 文本 ) → 布尔值

用户是否拥有该模式的权限?允许的权限类型有 CREATEUSAGE

has_sequence_privilege ( [ user 名称oid, ] sequence 文本oid, privilege 文本 ) → 布尔值

用户是否拥有该序列的权限?允许的权限类型有 USAGESELECTUPDATE

has_server_privilege ( [ user 名称oid, ] server 文本oid, privilege 文本 ) → 布尔值

用户是否对外部服务器拥有权限?唯一允许的权限类型是 USAGE

has_table_privilege ( [ user 名称oid, ] table 文本oid, privilege 文本 ) → 布尔值

用户是否对表拥有权限?允许的权限类型包括 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGER 以及 MAINTAIN

has_tablespace_privilege ( [ user 名称oid, ] tablespace 文本oid, privilege 文本 ) → 布尔值

用户是否对表空间拥有权限?唯一允许的权限类型是 CREATE

has_type_privilege ( [ user 名称oid, ] type 文本oid, privilege 文本 ) → 布尔值

用户是否对数据类型拥有权限?唯一允许的权限类型是 USAGE。在按名称指定类型而不是按 OID 指定类型时,允许的输入内容与 regtype 数据类型相同(请参阅 第 8.19 节)。

pg_has_role ( [ user 名称oid, ] role 文本oid, privilege 文本 ) → 布尔值

用户是否拥有角色权限?允许的权限类型为 MEMBERUSAGESETMEMBER 表示直接或间接角色成员,而不管授予什么特定权限。 USAGE 表示不执行 SET ROLE,角色权限是否立刻可用,而 SET 表示是否可以使用 SET ROLE 命令更改角色。可以向任何这些权限类型添加 WITH ADMIN OPTIONWITH GRANT OPTION 来测试是否拥有 ADMIN 权限(所有六种拼写测试相同的内容)。此函数不允许设置 userpublic 的特例,因为 PUBLIC 伪角色永远无法成为真实角色的成员。

row_security_active ( table textoid ) → boolean

是否在当前用户和当前环境的上下文中针对指定表激活行级别安全性?


表 9.71 显示可用于 aclitem 类型的运算符,此类型是访问权限的目录表示方式。请参阅 第 5.8 节,了解如何读取访问权限值的信息。

表 9.71. aclitem 运算符

运算符

说明

示例

aclitem = aclitemboolean

aclitem 是否相等?(请注意,类型 aclitem 缺少一组常规比较运算符;它只有相等性。反过来,aclitem 数组只能比较相等性。)

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

aclitem[] @> aclitemboolean

数组是否包含指定权限?(如果数组条目与 aclitem 的授权人和授予人相匹配,且具有至少指定的一组权限,则是 true。)

'{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.72 显示了一些用于管理 aclitem 类型的附加函数。

表 9.72. aclitem 函数

函数

说明

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

生成一个 aclitem 数组,其中包含属于 OID 为 ownerId 的角色的类型为 type 的对象的默认访问权限。当对象的 ACL 条目为 null 时,它表示将采用的访问权限。(第 5.8 节 中描述了默认的访问权限。)type 参数必须是 'c'(表示 COLUMN)、'r'(表示 TABLE 和表格类对象)、's'(表示 SEQUENCE)、'd'(表示 DATABASE)、'f'(表示 FUNCTIONPROCEDURE)、'l'(表示 LANGUAGE)、'L'(表示 LARGE OBJECT)、'n'(表示 SCHEMA)、'p'(表示 PARAMETER)、'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 列中表示为零。每个授予的权限表示为 SELECTINSERT 等(有关完整列表,请参阅 表 5.1)。请注意,每个权限都以单独的行形式出现,因此 privilege_type 列中仅显示一个关键字。

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

构造具有给定属性的 aclitemprivileges 是权限名称的逗号分隔列表,例如 SELECTINSERT 等,所有这些都设置在结果中。(权限字符串的大小写不重要,并在权限名称之间(但不在权限名称内)允许额外的空格。)


9.27.3. 架构可见性查询函数 #

表 9.73 显示用于确定当前模式搜索路径中特定对象是否 可见 的函数。例如,如果其包含模式在搜索路径中,并且没有同名表出现在搜索路径的前面,则该表被称为可见的。这相当于该表可以通过名称引用,而无需显式模式限定。因此,要列出所有可见表的名称

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

对于函数和运算符,搜索路径中的对象被认为是可见的,如果其名称 和参数数据类型 在路径中前面没有同名对象。对于运算符类型和族,则同时考虑名称和相关的索引访问方法。

表 9.73. 架构可见性查询函数

函数

说明

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);

请注意,这样测试非模式限定类型名称没有多大意义——如果名称根本无法识别,则该名称必须可见。

9.27.4. 系统目录信息功能 #

表 9.74列出了从系统目录提取信息的函数。

表 9.74. 系统目录信息功能

函数

说明

format_type ( type oid, typemod integer ) → text

返回由类型 OID 及可能由类型修饰符标识的数据类型的 SQL 名称。如果不知道具体的修饰符,请传递 NULL 作为类型修饰符。

pg_basetype ( regtype ) → regtype

返回由类型 OID 标识的域的基本类型的 OID。如果参数是非域类型的 OID,则按原样返回该参数。如果参数不是有效的类型 OID,则返回 NULL。如果存在域依赖链,它将递归直至找到基本类型。

假设 CREATE DOMAIN mytext AS text

pg_basetype('mytext'::regtype)text

pg_char_to_encoding ( encoding name ) → integer

将提供的编码名称转换成表示某些系统目录表中使用的内部标识符的整数。如果提供了未知编码名称,则返回 -1

pg_encoding_to_char ( encoding integer ) → name

将某些系统目录表中用作编码内部标识符的整数转换成可读字符串。如果提供了无效的编码编号,则返回空字符串。

pg_get_catalog_foreign_keys () → 集合记录 ( fktable regclass, fkcols text[], pktable regclass, pkcols text[], is_array 布尔值, is_opt 布尔值 )

返回描述 PostgreSQL 系统目录中存在的外键关系的记录集。 fktable 列包含引用目录的名称, fkcols 列包含引用列的名称。类似, pktable 列包含被引用目录的名称, pkcols 列包含被引用列的名称。如果 is_array 则为 true,最后的引用列是一个数组,每个元素都应匹配被引用目录中的某个条目。如果 is_opt 为 true,则允许引用列包含零而不是有效引用。

pg_get_constraintdef ( constraint oid [, pretty 布尔值 ] ) → 文本

为约束重建创建命令。(这是一个反编译的重建,而不是命令的原始文本。)

pg_get_expr ( expr pg_node_tree, relation oid [, pretty 布尔值 ] ) → 文本

反编译存储在系统目录中的表达式的内部形式,例如列的默认值。如果表达式可能包含 Vars,请将它们引用的关系的 OID 指定为第二个参数;如果不期望 Vars,则传递 0 就足够了。

pg_get_functiondef ( func oid ) → 文本

重构某个函数或过程的创建命令。(这是一种反编译的重构,而非该命令的原始文本。)结果为一条完整的 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

以需要在 CREATE FUNCTION 中出现的形式重构函数的 RETURNS 子句。该函数对过程返回 NULL

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

为某个索引重构创建命令。(这是一种反编译的重构,而非该命令的原始文本。)如果提供了 column 并且该值不为零,只重构该列的定义。

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

返回描述服务器识别的 SQL 关键字的一组记录。 word 列包含关键字。 catcode 列包含以下的类别代码:未保留关键字的 U,可以作为列名的关键字的 C,可以作为类型或函数名的关键字的 T,或者完全保留的关键字的 Rbarelabel 列包含 true,表示可以在 SELECT 列表中的 bare 列标签中使用此关键字,或者包含 false,表示只能在 AS 之后使用它。 catdesc 列包含一个可能已本地化的字符串来描述关键字的类别。 baredesc 列包含一个可能已本地化的字符串来描述关键字的列标签状态。

pg_get_partkeydef ( table oid ) → text

重建分区表的PARTITION BY子句中分区键的定义。 (这是一个反编译重建,而不是命令的原始文本。)

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

重建用于创建规则的命令。 (这是一个反编译重建,而不是命令的原始文本。)

pg_get_serial_sequence ( table text, column text ) → text

返回与列关联的序列名称或 NULL(如果没有序列与该列关联)。如果该列是标识列,则关联序列就是为该列内部创建的序列。对于使用其中一种序列类型 (serialsmallserialbigserial) 创建的列,则序列就是为该序列列定义创建的序列。在后一种情况下,可以使用 ALTER SEQUENCE OWNED BY 修改或删除关联。(该函数可能应该称为 pg_get_owned_sequence,它的当前名称反映了它在历史上已用于序列类型列这个事实。)第一个参数是一个带有可选架构的表名,第二个参数是一个列名。因为第一个参数可能同时包含架构和表名,所以它遵循常规的 SQL 规则进行解析,意思就是它默认使用小写。第二个参数只是一個列名,會被逐字對待,因此保留了它的大小寫。结果符合传递给序列函数的格式(参见第 9.17 节)。

一个典型的用法是用在读取标识或序列列的序列当前值,例如

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

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

测试索引列是否具有命名的属性。常见的索引列属性列在 表 9.75 中。(注意扩展访问方法可以为其索引定义其他属性名称。)如果不知道属性名称或其不适用于特定对象,或者如果 OID 或列号未识别出有效对象,则返回 NULL

pg_index_has_property ( index regclass, property text ) → boolean

测试索引是否具有命名的属性。常见的索引属性列在 表 9.76 中。(注意扩展访问方法可以为其索引定义其他属性名称。)如果不知道属性名称或其不适用于特定对象,或者如果 OID 未识别出有效对象,则返回 NULL

pg_indexam_has_property ( am oid, property text ) → boolean

测试索引访问方法是否具有已命名的属性。访问方法属性在表 9.77中列出。NULL 如果属性名称未知或不适用于特定对象,或如果 OID 未标识有效对象,则返回。

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

返回由 pg_class.reloptionspg_attribute.attoptions 中的值表示的存储选项的集合。

pg_settings_get_flags ( guc text ) → text[]

返回与给定 GUC 相关联的标志数组,或 NULL 如果它不存在。如果 GUC 存在,但没有要显示的标志,则结果将为空数组。仅公开表 9.78中列出的最有用的标志。

pg_tablespace_databases ( tablespace oid ) → setof oid

返回存储在指定表空间中的对象的数据库 OID 集合。如果此函数返回任何行,则表空间不为空,不能丢弃。要识别填充表空间的特定对象,您需要连接到 pg_tablespace_databases 识别的数据库,并查询其 pg_class 目录。

pg_tablespace_location ( tablespace oid ) → text

返回此表空间所在的文件系统路径。

pg_typeof ( "any" ) → regtype

返回传递给它的值的的数据类型的 OID。这有助于解决问题或动态构造 SQL 查询。该函数声明为返回 regtype,它是一个 OID 别名类型(参见第 8.19 节);这意味着它与 OID 相同用于比较目的,但显示为一个类型名称。

pg_typeof(33)integer

COLLATION FOR ( "any" ) → text

返回传递给它的值的排序规则名称。该值将加上引号并加前缀架构(如果需要)。如果没有为参数表达式派生出排序规则,则返回 NULL。如果参数不是可整理的数据类型,则会引发错误。

collation for ('foo'::text)"default"

collation for ('foo' COLLATE "de_DE")"de_DE"

to_regclass ( text ) → regclass

将文本关系名称转换为其 OID。通过将字符串强制转换为类型 regclass 可以获得类似的结果(参见 第 8.19 节< /a>);但是,如果找不到该名称,此函数将返回 NULL 而不是引发错误。

to_regcollation ( text ) → regcollation

将文本排序规则名称转换为其 OID。通过将字符串强制转换为类型 regcollation 可以获得类似的结果(参见第 8.19 节);但是,如果找不到该名称,此函数将返回 NULL 而不是引发错误。

to_regnamespace ( text ) → regnamespace

将文本模式名称转换为其 OID。通过将字符串强制转换为类型 regnamespace 可以获得类似的结果(参见 第 8.19 节);但是,如果找不到该名称,此函数将返回 NULL 而不是引发错误。

to_regoper ( text ) → regoper

将文本操作符名称转换为其 OID。 将字符串转换为类型 regoper 可以得到类似的结果(参见 第 8.19 节);然而,如果找不到名称或名称不明确,此函数将返回 NULL 而不是引发错误。

to_regoperator ( text ) → regoperator

将文本操作符名称(包含参数类型)转换为其 OID。 将字符串转换为类型 regoperator 可以得到类似的结果(参见 第 8.19 节);然而,如果名称不存在,此函数将返回 NULL 而不是引发错误。

to_regproc ( text ) → regproc

将文本函数或过程名称转换为其 OID。 将字符串转换为类型 regproc 可以得到类似的结果(参见 第 8.19 节);然而,如果名称不存在或不明确,此函数将返回 NULL 而不是引发错误。

to_regprocedure ( text ) → regprocedure

将文本函数或过程名称(带参数类型)转换为其 OID。 将字符串转换为类型 regprocedure 可以得到类似的结果(参见 第 8.19 节);然而,如果找不到该名称,此函数将返回 NULL 而不是引发错误。

to_regrole ( text ) → regrole

将文本角色名称转换为其 OID。 将字符串转换为类型 regrole 可以得到类似的结果(参见 第 8.19 节);然而,如果找不到名称,此函数将返回 NULL 而不是引发错误。

to_regtype ( text ) → regtype

解析一段文本,提取其中的潜在类型名称,然后将该名称转换为类型 OID。 字符串中出现语法错误将导致错误;但如果该字符串是合法的类型名称,恰巧没有在目录中找到,结果则为 NULL 。 将字符串转换为类型 regtype 可以得到类似的结果(参见 第 8.19 节),不同的是该操作将在找不到该名称时引发错误。

to_regtypemod ( 文本 ) → 整数

解析文本字符串,提取潜在类型名称并转换其类型修饰符(如果存在)。字符串中的语法错误将导致错误;但如果字符串是语法有效类型名称,但恰巧在目录中找不到,则结果将为 NULL。如果不存在类型修饰符,则结果为 -1

to_regtypemod 可与 to_regtype 一起使用,为 format_type 产生适当的输入,以便标准化表示类型名称的字符串。

format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)'))character varying(32)


大多数用于重建(反编译)数据库对象的函数都具有一个可选的 pretty 标记,如果为 true,则结果将为 pretty-printed。pretty-printed 会取消是不必要的括号,并添加空格以提高可读性。pretty-printed 格式更易于理解,但 PostgreSQL 的未来版本更有可能以相同的方式解释默认格式;因此,请避免在转储中使用 pretty-printed 输出。为 pretty 参数传递 false 会产生与省略参数相同的结果。

表 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 NULLIS NOT NULL 搜索?

表 9.76. 索引属性

名称 说明
clusterable 该索引可用于 CLUSTER 命令吗?
index_scan 该索引是否支持普通(非位图)扫描?
bitmap_scan 该索引是否支持位图扫描?
backward_scan 是否可以在中间扫描时更改扫描方向(以支持在无需物化的光标上执行 FETCH BACKWARD )?

表 9.77. 索引访问方法属性

名称 说明
can_order 访问方法是否支持 ASCDESCCREATE INDEX 中的相关关键字?
can_unique 访问方法是否支持唯一索引?
can_multi_col 访问方法是否支持具有多列的索引?
can_exclude 访问方法是否支持排除约束?
can_include 访问方法是否支持 CREATE INDEXINCLUDE 子句?

表 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.27.5. 对象信息和寻址函数 #

表 9.79 列出了与数据库对象标识和寻址相关的函数。

表 9.79. 对象信息和寻址函数

函数

说明

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

返回由目录 OID、对象 OID 和子对象 ID(例如表中的列号;引用整个对象的子对象 ID 为零)标识的数据库对象的文本描述。此描述可供人类阅读,并且可能会根据服务器配置进行翻译。这对于确定 pg_depend 目录中引用的对象的标识特别有用。此函数为未定义的对象返回 NULL 值。

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

返回包含足够信息以唯一标识由目录 OID、对象 OID 和子对象 ID 指定的数据库对象的行。此信息可供机器读取,且永不翻译。 type 标识数据库对象类型;schema 是对象所属的架构名称,或对于不属于架构的对象类型,为 NULLname 是对象的名称,如果需要,则带引号,如果名称(以及相关的架构名称,如果属实)足以唯一标识对象,则为 NULLidentity 是完整的对象标识,具体格式取决于对象类型,每个格式中的名称都具有架构限定和必要的引号。未定义的对象用 NULL 值标识。

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 的逆函数。未定义的对象使用 NULL 值标识。


9.27.6. 注释信息函数 #

表 9.80 中显示的函数提取与 COMMENT 命令一起存储的注释。如果未找到特定参数的注释,则返回 null 值。

表 9.80. 注释信息函数

函数

说明

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 指定的数据库对象的注释。此内容已弃用,因为无法保证不同的系统目录的 OID 具有唯一性;因此,可能会返回不正确的注释。

shobj_description ( object oid, catalog name ) → text

返回通过 OID 指定的共享数据库对象及包含系统目录的名称的注释。这与 obj_description 很像,只是用于检索对共享对象(即,数据库、角色和表空间)的评论。某些系统目录对于每个集群中的所有数据库都是全局的,其中对象的描述也作为全局形式存储。


9.27.7. 数据有效性检查函数 #

表 9.81 中显示的函数有助于检查提议输入数据的有效性。

表 9.81. 数据有效性检查函数

函数

说明

示例

pg_input_is_valid ( string text, type text ) → boolean

测试给定的 string 是否是指定数据类型的有效输入,返回真或假。

只有在数据类型的输入函数已更新为将无效输入报告为 soft 错误时,此函数才能按预期工作。否则,无效输入将中止事务,就像将字符串直接转换为类型一样。

pg_input_is_valid('42', 'integer')t

pg_input_is_valid('42000000000', 'integer')f

pg_input_is_valid('1234.567', 'numeric(7,4)')f

pg_input_error_info ( string text, type text ) → record ( message text, detail text, hint text, sql_error_code text )

测试给定的 string 是否是指定数据类型的有效输入;如果不是,则返回将引发的错误的详细信息。如果输入有效,则结果为 NULL。输入与 pg_input_is_valid 中的输入相同。

只有在数据类型的输入函数已更新为将无效输入报告为 soft 错误时,此函数才能按预期工作。否则,无效输入将中止事务,就像将字符串直接转换为类型一样。

SELECT * FROM pg_input_error_info('42000000000', 'integer')

                       message                        | detail | hint | sql_error_code
------------------------------------------------------+--------+------+----------------
 value "42000000000" is out of range for type integer |        |      | 22003

9.27.8. 事务 ID 和快照信息函数 #

9.82 中显示的函数提供可导出形式的服务器事务信息。这些函数的主要用途是确定在两个快照之间提交了哪些事务。

表 9.82. 事务 ID 和快照信息函数

函数

说明

pg_current_xact_id () → xid8

返回当前事务的 ID。如果当前事务尚未具有一个 ID(因为它未执行任何数据库更新),它将分配一个新的 ID;有关详细信息,请参阅 第 66.1 节。如果在子事务中执行此操作,这将返回顶级事务 ID;有关详细信息,请参阅 第 66.3 节

pg_current_xact_id_if_assigned () → xid8

返回当前事务的 ID,或在尚未分配 ID 的情况下返回 NULL。(如果事务可能是只读的,则最好使用此变体来避免不必要地使用 XID。)如果在子事务中执行此操作,这将返回顶级事务 ID。

pg_xact_status ( xid8 ) → text

报告最近事务的提交状态。结果之一为 in progresscommittedaborted,前提是事务足够新,并且系统保留了该事务的提交状态。如果该事务足够旧,以至于系统中没有对该事务的引用并且提交状态信息已丢弃,则结果为 NULL。举例来说,应用程序可以使用此函数来确定在 COMMIT 正在进行时应用程序和数据库服务器断开连接后其事务是已提交还是已中止。注意,准备好的事务报告为 in progress;如果应用程序需要确定事务 ID 是否属于准备好的事务,则必须检查 pg_prepared_xacts

pg_current_snapshot () → pg_snapshot

返回当前的快照,它是一种数据结构,显示了哪些事务 ID 目前正在进行中。快照中仅包含顶级事务 ID;不会显示子事务 ID;有关详细信息,请参阅 第 66.3 节

pg_snapshot_xip ( pg_snapshot ) → setof xid8

返回快照中包含的正在进行的事务 ID 的集合。

pg_snapshot_xmax ( pg_snapshot ) → xid8

返回快照的 xmax

pg_snapshot_xmin ( pg_snapshot ) → xid8

返回快照的 xmin

pg_visible_in_snapshot ( xid8, pg_snapshot ) → boolean

给定的事务 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 <= X < xmax 不在此列表中的事务 ID 已在快照时间点完成,因此根据其提交状态而可见或已终止。此列表不包含子事务 (subxids) 的事务 ID。

在 13 版之前的 PostgreSQL 版本中没有 xid8 类型,所以提供了这些函数的变体,这些变体使用 bigint 表示 64 位 XID,具有相应不同的快照数据类型 txid_snapshot。这些较早的函数的名称中带有 txid。它们仍受支持以保持向后兼容性,但可能会从未来版本中移除。请参见 表 9.84

表 9.84。已弃用的事务 ID 和快照信息函数

函数

说明

age ( xid ) → integer

返回提供的交易 ID 与当前交易计数器之间的交易数。

mxid_age ( xid ) → integer

返回提供的 MultiXact ID 与当前 MultiXact 计数器之间的 MultiXact 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()


9.27.9. 已提交事务信息函数 #

表 9.85 中显示的函数提供有关过去事务提交时间的信息。 它们仅在 track_commit_timestamp 配置选项启用后提供有用的数据,并且仅对已提交的事务启用此选项。清除真空后通常会删除提交时间戳信息。

表 9.85. 已提交事务信息函数

函数

说明

pg_xact_commit_timestamp ( xid ) → timestamp with time zone

返回事务的提交时间戳。

pg_xact_commit_timestamp_origin ( xid ) → record ( timestamp timestamp with time zone, roident oid)

返回事务的提交时间戳和复制源。

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

返回已提交事务的最新事务 ID、提交时间戳和复制源。


9.27.10. 控制数据函数 #

表 9.86 中显示的函数打印在 initdb 期间初始化的信息,例如目录版本。 它们还显示有关预写式日志记录和检查点处理的信息。 此信息是集群范围内的,不特定于任何数据库。 这些函数从与 pg_controldata 应用程序相同的来源提供大部分相同的信息。

表 9.86. 控制数据函数

函数

说明

pg_control_checkpoint () → record

返回有关当前检查点状态的信息,如 表 9.87 中所示。

pg_control_system () → 记录

返回有关当前控制文件状态的信息,如 表 9.88 中所示。

pg_control_init () → 记录

返回有关群集初始化状态的信息,如 表 9.89 中所示。

pg_control_recovery () → 记录

返回有关恢复状态的信息,如 表 9.90 中所示。


表 9.87。pg_control_checkpoint 输出列

列名 数据类型
checkpoint_lsn pg_lsn
redo_lsn pg_lsn
redo_wal_file 文本
timeline_id 整数
prev_timeline_id 整数
full_page_writes 布尔值
next_xid 文本
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 带时区的时间戳

表 9.88。pg_control_system 输出列

列名 数据类型
pg_control_version 整数
catalog_version_no 整数
system_identifier bigint
pg_control_last_modified 带时区的时间戳

表 9.89。pg_control_init 输出列

列名 数据类型
max_data_alignment 整数
database_block_size 整数
blocks_per_segment 整数
wal_block_size 整数
bytes_per_wal_segment 整数
max_identifier_length 整数
max_index_columns 整数
max_toast_chunk_size 整数
large_object_chunk_size 整数
float8_pass_by_value 布尔值
data_page_checksum_version 整数

表 9.90。pg_control_recovery 输出列

列名 数据类型
min_recovery_end_lsn pg_lsn
min_recovery_end_timeline 整数
backup_start_lsn pg_lsn
backup_end_lsn pg_lsn
end_of_backup_record_required 布尔值

9.27.11。版本信息函数 #

表 9.91 中所示的函数打印版本信息。

表 9.91。版本信息函数

函数

说明

version () → 文本

返回值描述 PostgreSQL 服务器版本的字符串。您也可以从 server_version 获取此信息,或使用 server_version_num 获取机器可读版本。软件开发者应使用 server_version_num(自 8.2 起获得)或 PQserverVersion,而不是解析文本版本。

unicode_version () → text

返回值表示 PostgreSQL 使用的 Unicode 版本的字符串。

icu_unicode_version () → text

返回值表示 ICU 使用的 Unicode 版本的字符串(如果服务器使用 ICU 支持构建);否则返回值为 NULL


9.27.12. WAL 汇总信息函数 #

9.92 中显示的函数打印有关 WAL 汇总状态的信息。参见 summarize_wal

表 9.92. WAL 汇总信息函数

函数

说明

pg_available_wal_summaries () → setof record ( tli bigint, start_lsn pg_lsn, end_lsn pg_lsn )

返回值有关数据目录中 pg_wal/summaries 下存在的 WAL 汇总文件的信息。每列一个 WAL 汇总文件返回一行。每个文件汇总在 LSN 范围内给定的 TLI 上的 WAL。此函数可能有助于确定服务器上是否存在足够的 WAL 汇总,以基于已知的某个先前备份(其开始 LSN 已知)进行增量备份。

pg_wal_summary_contents ( tli bigint, start_lsn pg_lsn, end_lsn pg_lsn ) → setof record ( relfilenode oid, reltablespace oid, reldatabase oid, relforknumber smallint, relblocknumber bigint, is_limit_block boolean )

返回由 TLI 标识的单个 WAL 摘要文件的内容中一个信息,并开始和结束 LSN。每行“is_limit_block” False 指示由其余输出列标识的块由该文件摘要的记录范围内的至少一条 WAL 记录修改的。每行“is_limit_block” true 指示 (a) 关联分叉被截断到 WAL 记录相关范围内 relblocknumber 给定的长度,或 (b) 相关分叉在 WAL 记录相关范围内创建或删除;在这种情况下,relblocknumber 将为零。

pg_get_wal_summarizer_state () → recordsummarized_tli bigint, summarized_lsn pg_lsn, pending_lsn pg_lsn, summarizer_pid int

返回 WAL 摘要器的进程信息。如果 WAL 摘要器在实例启动后从未运行,则 summarized_tlisummarized_lsn 分别为 00/0;否则,它们将是写入磁盘的最后一个 WAL 摘要文件的 TLI 和结束 LSN。如果 WAL 摘要器当前正在运行,pending_lsn 将是它已使用的上一条记录的结束 LSN,它必须始终大于或等于 summarized_lsn;如果 WAL 摘要器没有运行,它将等于 summarized_lsnsummarizer_pid 是 WAL 摘要过程的 PID(如果它正在运行,否则为 NULL)。

作为特例,WAL 摘要器拒绝在 wal_level=minimal 生成的 WAL 上运行时生成 WAL 摘要文件,因为这些摘要不适合用作增量备份的基础。在这种情况下,上面的字段将继续前进,就像正在生成摘要一样,但不会向磁盘写入任何内容。一旦摘要器到达在 wal_level 设置为 replica 或更高的级别时生成的 WAL,它将恢复向磁盘写入摘要。