↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

9.27. 系统信息函数和操作符 #

本节描述的函数用于获取有关 PostgreSQL 安装的各种信息。

9.27.1. 会话信息函数 #

表 9.69 列出了多个用于提取会话和系统信息的函数。

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

表 9.69. 会话信息函数

函数

描述

current_catalog → name

current_database () → name

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

current_query () → text

返回客户端提交的当前正在执行的查询文本(可能包含多条语句)。

current_role → name

这个等同于 current_user。

current_schema → name

current_schema () → name

返回在搜索路径中的第一个模式的名称(如果搜索路径为空则返回空值)。这个模式将用于没有指定目标模式就创建的任何表或其他已命名对象。

current_schemas ( include_implicit boolean ) → name[]

返回当前有效搜索路径中所有模式名称的数组,按优先级排序。(当前 search_path 设置中不对应于已存在且可搜索的模式的项会被省略。)如果布尔参数为 true,结果还会包含 pg_catalog 等隐式搜索的系统模式。

current_user → name

返回当前执行上下文的用户名。

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(即 pg_backend_pid 的结果)。因此,结果中可能出现重复的 PID。另外,如果持有冲突锁的是一个预备事务,结果中会用进程 ID 0 表示它。

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

pg_conf_load_time () → timestamp with time zone

返回服务器配置文件最近一次加载的时间。如果当时当前会话已经存在,则返回该会话自身重新读取配置文件的时间(因此不同会话中的返回时间会略有不同)。否则,返回 postmaster 进程重新读取配置文件的时间。

pg_current_logfile ( [ text ] ) → text

返回当前由日志收集器使用的日志文件的路径名。路径包括 log_directory 目录和单独的日志文件名。如果日志收集器已禁用,则结果为 NULL。当存在多个日志文件,每个以不同格式存在时,不带参数的 pg_current_logfile 返回有序列表中找到的第一个格式的文件路径:stderr,csvlog,jsonlog。如果没有任何日志文件具有这些格式,则返回 NULL。要请求有关特定日志文件格式的信息,请将 csvlog,jsonlog 或 stderr 作为可选参数的值。如果请求的日志格式未在 log_destination 中配置,则结果为 NULL。结果反映 current_logfiles 文件的内容。

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

pg_my_temp_schema () → oid

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

pg_is_other_temp_schema ( oid ) → boolean

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

pg_jit_available () → boolean

如果 JIT 编译器扩展可用(参见第 30 章),并且 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;如果不存在这样的服务器进程,或该进程未被阻塞,则返回空数组。

运行 SERIALIZABLE 事务的会话会阻止 SERIALIZABLE READ ONLY DEFERRABLE 事务获取快照,直到后者确定可以安全地避免获取谓词锁。关于可序列化和可延迟事务的更多信息,请参见第 13.2.3 节。

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

pg_trigger_depth () → integer

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

session_user → name

返回会话用户名。

system_user → text

返回用户在被分配数据库角色之前,于认证周期中提供的认证方法和身份(如果有)。结果表示为 auth_method:identity;如果用户未被认证(例如使用了 Trust 认证),则返回 NULL。

user → name

这个相当于 current_user。


注意

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

表 9.70 列出了允许以编程方式查询对象访问权限的函数。(关于权限的更多信息,请参见第 5.8 节。)在这些函数中,可以通过名称或 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');

表 9.70. 访问权限查询函数

函数

描述

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 数据类型相同(参见第 8.19 节)。一个示例为:

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

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

用户对语言有权限吗?唯一允许的权限类型是 USAGE。

has_parameter_privilege ( [ user name or oid, ] parameter text, privilege text ) → boolean

用户是否具有配置参数的权限?参数名称不区分大小写。允许的权限类型为 SET 和 ALTER SYSTEM。

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

用户对模式有权限吗?允许的权限类型是 CREATE 和 USAGE。

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 和 MAINTAIN。

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 数据类型相同(参见第 8.19 节)。

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

用户是否具有角色权限?允许的权限类型为 MEMBER、USAGE 和 SET。MEMBER 表示对该角色的直接或间接成员资格,而不考虑由此授予的具体权限。USAGE 表示该角色的权限是否无需执行 SET ROLE 即可立即使用,而 SET 表示是否可以使用 SET ROLE 命令切换到该角色。任一权限类型后面都可以附加 WITH ADMIN OPTION 或 WITH GRANT OPTION,用于测试是否持有 ADMIN 权限(这六种写法测试的都是同一件事)。此函数不允许将 user 设置为 public 这一特殊情况,因为 PUBLIC 伪角色永远不能成为实际角色的成员。

row_security_active ( table text or oid ) → boolean

在当前用户和当前环境的上下文中,指定表的行级安全是否生效?


表 9.71 列出了 aclitem 类型可用的操作符;该类型是访问权限在系统目录中的表示形式。有关如何解读访问权限值的信息,请参见第 5.8 节。

表 9.71. aclitem 操作符

操作符

描述

示例

aclitem = aclitem → boolean

两个 aclitem 是否相等?(注意,aclitem 类型没有通常的整套比较操作符,而只支持相等比较。因此,aclitem 数组也只能进行相等比较。)

'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem → f

aclitem[] @> aclitem → boolean

数组是否包含指定的权限?(如果数组中存在一个条目,其被授权者和授权者与该 aclitem 相同,且至少包含指定的全部权限,则返回真。)

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


表 9.72 列出了一些用于管理 aclitem 类型的其他函数。

表 9.72. aclitem 函数

函数

描述

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

构造一个 aclitem 数组,保存类型为 type、属于 OID 为 ownerId 的角色的对象的默认访问权限。当对象的 ACL 条目为空值时,会采用这些访问权限。(默认访问权限见第 5.8 节。)type 参数必须为以下值之一:'c' 表示 COLUMN,'r' 表示 TABLE 和类似表的对象,'s' 表示 SEQUENCE,'d' 表示 DATABASE,'f' 表示 FUNCTION 或 PROCEDURE,'l' 表示 LANGUAGE,'L' 表示 LARGE OBJECT,'n' 表示 SCHEMA,'p' 表示 PARAMETER,'t' 表示 TABLESPACE,'F' 表示 FOREIGN DATA WRAPPER,'S' 表示 FOREIGN SERVER,'T' 表示 TYPE 或 DOMAIN。

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

以行集的形式返回 aclitem 数组。如果被授权者是伪角色 PUBLIC,则在 grantee 列中用零表示。每项授予的权限表示为 SELECT、INSERT 等(完整列表见表 5.1)。注意,每项权限都会拆成单独的一行,因此 privilege_type 列中只会出现一个关键字。

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

使用给定的属性构造 aclitem。privileges 是以逗号分隔的权限名列表,例如 SELECT、INSERT 等,列出的所有权限都会设置在结果中。(权限字符串不区分大小写,权限名之间允许有额外的空白,但权限名内部不允许。)


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 别名类型会很方便(regclass,regtype,regprocedure,regoperator,regconfig,或 regdictionary),例如:

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 () → setof record ( fktable regclass, fkcols text[], pktable regclass, pkcols text[], is_array boolean, is_opt boolean )

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

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

重建约束的创建命令。(这是反编译重建的结果,并非命令的原始文本。)

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

反编译存储在系统目录中的表达式的内部形式,例如列的默认值。如果表达式可能包含 Var 节点,请将它们所引用的关系的 OID 指定为第二个参数;如果预计不含 Var 节点,传入零即可。

pg_get_functiondef ( func oid ) → text

重建函数或过程的创建命令。(这是反编译重建的结果,并非命令的原始文本。)结果是一条完整的 CREATE OR REPLACE FUNCTION 或 CREATE 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", barelabel boolean, catdesc text, baredesc text )

返回描述服务器所识别 SQL 关键字的一组记录。word 列包含关键字。catcode 列包含类别代码:U 表示非保留关键字,C 表示可用作列名的关键字,T 表示可用作类型名或函数名的关键字,R 表示完全保留的关键字。如果关键字可以在 SELECT 列表中用作“裸”列标签,barelabel 列为 true;如果只能在 AS 之后使用,则为 false。catdesc 列包含描述关键字类别的字符串,该字符串可能已被本地化。baredesc 列包含描述关键字列标签状态的字符串,该字符串可能已被本地化。

pg_get_partition_constraintdef ( table oid ) → text

重建分区约束的定义。(这是反编译重建的结果,并非命令的原始文本。)

pg_get_partkeydef ( table oid ) → text

重建分区表的分区键定义,采用其在 CREATE TABLE 的 PARTITION BY 子句中的形式。(这是反编译重建的结果,并非命令的原始文本。)

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

重建规则的创建命令。(这是反编译重建的结果,并非命令的原始文本。)

pg_get_serial_sequence ( table text, column text ) → text

返回与列相关联的序列名称,如果没有序列与该列相关联则返回 NULL。如果列是标识列,则关联序列是在内部为该列创建的序列。对于使用一种 serial 类型(serial、smallserial、bigserial)创建的列,它是为该 serial 列定义创建的序列。在后一种情况下,可以使用 ALTER SEQUENCE OWNED BY 修改或删除关联。(这个函数可能应该被称为 pg_get_owned_sequence;它的当前名称反映了它在历史上曾与 serial 类型的列一起使用。)第一个参数是具有可选模式的表名,第二个参数是列名。由于第一个参数可能包含模式名和表名,因此按照通常的 SQL 规则解析它,这意味着默认情况下它是小写的。第二个参数只是一个列名,按照字面来处理,因此保留了它的大小写。结果经过了适当的格式化,可以传递给序列函数(参见第 9.17 节)。

典型用法是读取标识列或 serial 列所用序列的当前值,例如:

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 所示。如果属性名未知或不适用于特定对象,或者 OID 不能识别有效的对象,则返回 NULL。

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

返回源自 pg_class.reloptions 或 pg_attribute.attoptions 的值表示的存储选项集。

pg_settings_get_flags ( guc text ) → text[]

返回与给定 GUC 关联的标志数组;如果该 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 节);但是,如果没有找到名称,这个函数将返回 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 ( text ) → integer

解析文本字符串,从中提取可能的类型名称,并转换其类型修饰符(如果有)。字符串中的语法错误会引发错误;但如果字符串是语法有效的类型名称,只是在系统目录中找不到,则结果为 NULL。如果没有类型修饰符,则结果为 -1。

to_regtypemod 可以与 to_regtype 结合,为 format_type 生成适当的输入,从而将表示类型名称的字符串转换为规范形式。

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


大多数重建(反编译)数据库对象的函数都有一个可选的 pretty 标志;若为 true,则对结果进行“美化输出”。美化输出会省略不必要的圆括号,并增加空白以提高可读性。美化后的格式更易读,但默认格式更有可能被 PostgreSQL 的未来版本以同样的方式解释,因此用于转储时应避免美化输出。为 pretty 参数传入 false 与省略该参数的结果相同。

表 9.75. 索引列属性

名称描述
asc在向前扫描时列是按照升序排列吗?
desc在向前扫描时列是按照降序排列吗?
nulls_first在向前扫描时列排序会把空值排在前面吗?
nulls_last在向前扫描时列排序会把空值排在最后吗?
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访问方法是否支持 ASC、DESC 以及 CREATE INDEX 中的有关关键词?
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.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 是对象所属的模式名,对于不属于模式的对象类型则为 NULL;如果对象名(以及适用时的模式名)足以唯一标识该对象,name 就是对象名,并在必要时加引号,否则为 NULL;identity 是完整的对象标识,其具体格式取决于对象类型,格式中的每个名称都会根据需要加上模式限定和引号。未定义的对象以 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_names 和 object_args 是 text 数组,共同构成对该对象的引用。将这三个值传给 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_object 或 pg_identify_object 等其他系统函数。classid 是包含该对象的系统目录的 OID;objid 是对象自身的 OID;objsubid 是子对象 ID,没有子对象时为零。此函数执行 pg_identify_object_as_address 的逆操作。未定义的对象以 NULL 值标识。


9.27.6. 注释信息函数 #

表 9.80 中的函数用于提取此前通过 COMMENT 命令存储的注释。如果找不到与指定参数对应的注释,则返回空值。

表 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 是否是指定数据类型的有效输入,返回 true 或 false。

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

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 相同。

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

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 和快照信息函数

函数

描述

age ( xid ) → integer

返回给定事务 ID 与当前事务计数器之间的事务数。

mxid_age ( xid ) → integer

返回给定多事务 ID 与当前多事务计数器之间的多事务 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 progress、committed 或 aborted。如果事务已足够旧,系统中不再有对它的引用,且提交状态信息已被丢弃,则返回 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 节。

pg_get_multixact_members ( multixid xid ) → setof record ( xid xid, mode text )

返回指定多事务 ID 中每个成员的事务 ID 和锁模式。锁模式 forupd、fornokeyupd、sh 和 keysh 分别对应于第 13.3.2 节中描述的行级锁 FOR UPDATE、FOR NO KEY UPDATE、FOR SHARE 和 FOR KEY SHARE。另有两种多事务特有的模式:nokeyupd 用于不修改键列的更新,upd 用于修改键列的更新或删除。


内部事务 ID 类型 xid 是 32 位宽,每 40 亿个事务就会回卷一次(wrap around)。但是,表 9.82 中所示的函数(age、mxid_age 和 pg_get_multixact_members 除外)使用的是 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 在生成快照时已经完成,因此根据其提交状态,要么可见,要么失效。此列表不包含子事务的事务 ID(subxid)。

在 PostgreSQL13 以前的版本中,没有 xid8 类型,因此提供了这些函数的变体,使用 bigint 表示 64 位 XID,并相应地提供不同的快照数据类型 txid_snapshot。这些旧的函数在它们的名字中有 txid。为保持向后兼容,这些函数仍受支持,但可能会在未来版本中被移除。参见表 9.84。

表 9.84. 已弃用的事务 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 () → record

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

pg_control_init () → record

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

pg_control_recovery () → record

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


表 9.87. pg_control_checkpoint 输出列

列名称数据类型
checkpoint_lsnpg_lsn
redo_lsnpg_lsn
redo_wal_filetext
timeline_idinteger
prev_timeline_idinteger
full_page_writesboolean
next_xidtext
next_oidoid
next_multixact_idxid
next_multi_offsetxid
oldest_xidxid
oldest_xid_dbidoid
oldest_active_xidxid
oldest_multi_xidxid
oldest_multi_dbidoid
oldest_commit_ts_xidxid
newest_commit_ts_xidxid
checkpoint_timetimestamp with time zone

表 9.88. pg_control_system 输出列

列名称数据类型
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

表 9.89. pg_control_init 输出列

列名称数据类型
max_data_alignmentinteger
database_block_sizeinteger
blocks_per_segmentinteger
wal_block_sizeinteger
bytes_per_wal_segmentinteger
max_identifier_lengthinteger
max_index_columnsinteger
max_toast_chunk_sizeinteger
large_object_chunk_sizeinteger
float8_pass_by_valueboolean
data_page_checksum_versioninteger

表 9.90. pg_control_recovery 输出列

列名称数据类型
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean

9.27.11. 版本信息函数 #

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

表 9.91. 版本信息函数

函数

描述

version () → text

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

unicode_version () → text

返回一个表示 PostgreSQL 所使用的 Unicode 版本的字符串。

icu_unicode_version () → text

如果服务器在构建时启用了 ICU 支持,则返回一个表示 ICU 所使用的 Unicode 版本的字符串;否则返回 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 汇总文件返回一行。每个文件都汇总了指定 TLI 上、指定 LSN 范围内的 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 以及起始和结束 LSN 标识的单个 WAL 汇总文件内容的信息。每一行中,如果 is_limit_block 为 false,则表示其余输出列所标识的块在该文件所汇总的 WAL 记录范围内被至少一条 WAL 记录修改过。每一行中,如果 is_limit_block 为 true,则表示以下两种情况之一:(a) 该关系分支在相关 WAL 记录范围内被截断到 relblocknumber 给出的长度;或者 (b) 该关系分支在相关 WAL 记录范围内被创建或删除;在创建或删除的情况下,relblocknumber 将为零。

pg_get_wal_summarizer_state () → record ( summarized_tli bigint, summarized_lsn pg_lsn, pending_lsn pg_lsn, summarizer_pid int )

返回有关 WAL 汇总器进度的信息。如果自实例启动以来 WAL 汇总器从未运行过,则 summarized_tli 和 summarized_lsn 将分别为 0 和 0/0;否则,它们将是最近写入磁盘的 WAL 汇总文件的 TLI 和结束 LSN。如果 WAL 汇总器当前正在运行,pending_lsn 将是它已消费的最后一条记录的结束 LSN,该值必定始终大于或等于 summarized_lsn;如果 WAL 汇总器未在运行,则它将等于 summarized_lsn。summarizer_pid 是 WAL 汇总器进程的 PID;如果它正在运行则返回该 PID,否则为 NULL。

作为一个特殊例外,如果在 wal_level=minimal 下生成的 WAL 上运行,WAL 汇总器将拒绝生成 WAL 汇总文件,因为这种汇总用作增量备份的基础是不安全的。在这种情况下,上述字段仍会像正在生成汇总一样继续推进,但不会有任何内容写入磁盘。一旦汇总器处理到在 wal_level 被设置为 replica 或更高时生成的 WAL,它就会恢复将汇总写入磁盘。


报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.