支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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_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(即 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 返回在有序列表中找到的第一个格式的文件路径:stderrcsvlogjsonlog。 如果没有日志文件具有这些格式,则返回 NULL。 要请求有关特定日志文件格式的信息,请提供 csvlogjsonlogstderr 作为可选参数的值。 如果请求的日志格式未在 log_destination 中配置,则结果为 NULL。 结果反映了 current_logfiles 文件的内容。

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

pg_my_temp_schema () → oid

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

pg_is_other_temp_schema ( oid ) → boolean

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

pg_jit_available () → boolean

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

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 数组,如果不存在此类服务器进程或未被阻止,则返回空数组。

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

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

pg_trigger_depth () → integer

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

session_username

返回会话用户的名称。

system_usertext

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

username

这等效于 current_user


注意

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

session_user 通常是启动当前数据库连接的用户;但是,超级用户可以使用 SET SESSION AUTHORIZATION 来更改此设置。current_user 是适用于权限检查的用户标识符。通常,它等于会话用户,但是可以使用 SET ROLE 来更改。它也会在执行具有 SECURITY DEFINER 属性的函数期间发生变化。在 Unix 术语中,会话用户是 实际用户,当前用户是 有效用户current_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 nameoid, ] function textoid, privilege text ) → boolean

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

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

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

has_language_privilege ( [ user nameoid, ] language textoid, privilege text ) → boolean

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

has_parameter_privilege ( [ user nameoid, ] parameter text, privilege text ) → boolean

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

has_schema_privilege ( [ user nameoid, ] schema textoid, privilege text ) → boolean

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

has_sequence_privilege ( [ user nameoid, ] sequence textoid, privilege text ) → boolean

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

has_server_privilege ( [ user nameoid, ] server textoid, privilege text ) → boolean

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

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

用户是否拥有表的权限?允许的权限类型为 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERMAINTAIN

has_tablespace_privilege ( [ user nameoid, ] tablespace textoid, privilege text ) → boolean

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

has_type_privilege ( [ user nameoid, ] type textoid, privilege text ) → boolean

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

pg_has_role ( [ user nameoid, ] role textoid, privilege text ) → boolean

用户是否拥有角色的权限?允许的权限类型为 MEMBERUSAGESETMEMBER 表示直接或间接属于该角色,而不考虑可能授予的具体权限。USAGE 表示是否可以在不执行 SET ROLE 的情况下立即使用角色的权限,而 SET 表示是否可以使用 SET ROLE 命令更改为该角色。可以将 WITH ADMIN OPTIONWITH GRANT OPTION 添加到任何这些权限类型中,以测试是否持有 ADMIN 权限(所有六种拼写都测试同一件事)。此函数不允许将 user 设置为 public 的特殊情况,因为 PUBLIC 伪角色永远不能是真实角色的成员。

row_security_active ( table textoid ) → boolean

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


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

表 9.71. 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


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

表 9.72. aclitem 函数

函数

描述

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

构造一个 aclitem 数组,其中包含属于 OID 为 ownerId 的角色的类型为 type 的对象的默认访问权限。这表示当对象的 ACL 条目为空时将假定的访问权限。(默认访问权限在第 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 () → setof record ( fktable regclass, fkcols text[], pktable regclass, pkcols text[], is_array boolean, is_opt boolean )

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

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

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

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

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

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", barelabel boolean, catdesc text, baredesc text )

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

pg_get_partkeydef ( table oid ) → text

重建分区表的“分区键”定义,其形式应出现在 CREATE TABLEPARTITION 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中列出。如果属性名称未知或不适用于特定对象,或者 OID 未标识有效对象,则返回NULL

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 节);但是,如果找不到名称,此函数将返回 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 该列在正向扫描时是否将 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 访问方法是否支持 CREATE INDEX 中的 ASCDESC 和相关关键字?
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 是否是指定数据类型的有效输入,返回 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 和快照信息函数

函数

描述

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 大 1。所有大于或等于 xmax 的事务 ID 在快照时尚未完成,因此是不可见的。
xip_list 快照时正在进行的事务。在 xmin <= X < xmax 且不在该列表中的事务 ID 在快照时已完成,因此根据其提交状态是可见的还是失效的。此列表不包括子事务(subxid)的事务 ID。

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

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

函数

描述

age ( xid ) → integer

返回所提供的事务 ID 与当前事务计数器之间的事务数。

mxid_age ( xid ) → integer

返回所提供的多事务 ID 与当前多事务计数器之间的多事务 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 配置选项启用时,它们才提供有用的数据,并且仅针对启用后提交的事务。提交时间戳信息会在 vacuum 期间定期删除。

表 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_lsn pg_lsn
redo_lsn pg_lsn
redo_wal_file text
timeline_id integer
prev_timeline_id integer
full_page_writes boolean
next_xid text
next_oid oid
next_multixact_id xid
next_multi_offset xid
oldest_xid xid
oldest_xid_dbid oid
oldest_active_xid xid
oldest_multi_xid xid
oldest_multi_dbid oid
oldest_commit_ts_xid xid
newest_commit_ts_xid xid
checkpoint_time timestamp with time zone

表 9.88. pg_control_system 输出列

列名 数据类型
pg_control_version integer
catalog_version_no integer
system_identifier bigint
pg_control_last_modified timestamp with time zone

表 9.89. pg_control_init 输出列

列名 数据类型
max_data_alignment integer
database_block_size integer
blocks_per_segment integer
wal_block_size integer
bytes_per_wal_segment integer
max_identifier_length integer
max_index_columns integer
max_toast_chunk_size integer
large_object_chunk_size integer
float8_pass_by_value boolean
data_page_checksum_version integer

表 9.90. pg_control_recovery 输出列

列名 数据类型
min_recovery_end_lsn pg_lsn
min_recovery_end_timeline integer
backup_start_lsn pg_lsn
backup_end_lsn pg_lsn
end_of_backup_record_required boolean

9.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 摘要文件将返回一行。每个文件汇总了指示 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 以及起始和结束 LSN 标识的单个 WAL 摘要文件的内容的信息。每一行 is_limit_block 为 false 表示由其余输出列标识的块已由该文件汇总的记录范围内的至少一个 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_tlisummarized_lsn 将分别为 00/0;否则,它们将是写入磁盘的最后一个 WAL 摘要文件的 TLI 和结束 LSN。如果 WAL 摘要器当前正在运行,则 pending_lsn 将是它已消耗的最后一个记录的结束 LSN,该 LSN 必须始终大于或等于 summarized_lsn;如果 WAL 摘要器未运行,它将等于 summarized_lsnsummarizer_pid 是 WAL 摘要器进程的 PID(如果它正在运行),否则为 NULL。

作为一种特殊例外,如果 WAL 是在 wal_level=minimal 下生成的,则 WAL 摘要器将拒绝生成 WAL 摘要文件,因为此类摘要作为增量备份的基础使用是不安全的。在这种情况下,上面的字段将继续前进,就像正在生成摘要一样,但不会将任何内容写入磁盘。一旦摘要器到达在 wal_level 设置为 replica 或更高时生成的 WAL,它将恢复将摘要写入磁盘。


提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。