选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

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

Table 9.63展示了多个可以抽取会话和系统信息的函数。

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

Table 9.63. 会话信息函数

名称 返回类型 描述
current_catalog name 当前数据库名称(在 SQL 标准中称为目录
current_database() name 当前数据库名称
current_query() text 客户端提交的当前执行查询文本(可能包含多条语句)
current_role name 等价于 current_user
current_schema[()] name 当前模式名称
current_schemas(boolean) name[] 搜索路径中的模式名称,可选地包含隐式模式
current_user name 当前执行上下文的用户名
inet_client_addr() inet 远端连接地址
inet_client_port() int 远端连接端口
inet_server_addr() inet 本地连接地址
inet_server_port() int 本地连接端口
pg_backend_pid() int 服务当前会话的服务器进程的进程 ID
pg_blocking_pids(int) int[] 阻止指定服务器进程 ID 获取锁的进程 ID
pg_conf_load_time() timestamp with time zone 配置加载时间
pg_current_logfile([text]) text 日志收集器当前使用的主要日志文件名,或指定格式的日志文件名
pg_my_temp_schema() oid 会话临时模式的 OID;不存在时为 0
pg_is_other_temp_schema(oid) boolean 该模式是否为另一个会话的临时模式?
pg_jit_available() boolean JIT 编译器扩展是否可用(参见Chapter 31),且 jit 配置参数是否设为 on
pg_listening_channels() setof text 会话当前监听的通道名称
pg_notification_queue_usage() double 异步通知队列当前已占用的比例(0-1)
pg_postmaster_start_time() timestamp with time zone 服务器启动时间
pg_safe_snapshot_blocking_pids(int) int[] 阻止指定服务器进程 ID 获取安全快照的进程 ID
pg_trigger_depth() int PostgreSQL 触发器的当前嵌套层级(如果不是从触发器内部直接或间接调用,则为 0)
session_user name 会话用户名
user name 等价于 current_user
version() text PostgreSQL 版本信息。机器可读的版本另见server_version_num

Note

current_catalogcurrent_rolecurrent_schemacurrent_usersession_useruserSQL里有特殊的语法地位: 它们被调用时结尾不要跟着圆括号。 在 PostgreSQL 中,圆括号可以有选择性地被用于current_schema,但是不能和其他的一起用。

session_user通常是发起当前数据库连接的用户,不过超级用户可以用SET SESSION AUTHORIZATION修改这个设置。 current_user是用于权限检查的用户标识。通常, 它总是等于会话用户,但是可以被SET ROLE改变。 它也会在函数执行的过程中随着属性SECURITY DEFINER的改变而改变。 在 Unix 的说法里,那么会话用户是真实用户,而当前用户是有效用户current_role以及usercurrent_user的同义词(SQL标准在current_rolecurrent_user之间做了区分,但PostgreSQL不区分,因为它把用户和角色统一成了一种实体)。

current_schema 返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回空值)。在创建表或其他命名对象时,如果未指定目标模式,就会使用该模式。current_schemas(boolean) 返回当前搜索路径中所有模式名称的数组。布尔选项决定是否在返回的搜索路径中包含 pg_catalog 等隐式包含的系统模式。

Note

可以在运行时修改搜索路径,命令如下:

SET search_path TO schema [, schema, ...]

inet_client_addr 返回当前客户端的 IP 地址,inet_client_port 返回端口号。inet_server_addr 返回服务器接受当前连接所用的 IP 地址,inet_server_port 返回端口号。如果当前连接通过 Unix 域套接字建立,这些函数都返回 NULL。

pg_blocking_pids 返回一个数组,包含阻塞指定进程 ID 对应的服务器进程的会话进程 ID;如果不存在这样的服务器进程,或该进程未被阻塞,则返回空数组。一个服务器进程会在以下情况下阻塞另一个进程:它持有与被阻塞进程请求的锁冲突的锁(硬阻塞);或者它正在等待一个会与被阻塞进程请求的锁冲突的锁,并且在等待队列中位于被阻塞进程之前(软阻塞)。使用并行查询时,即使实际持锁或等待锁的是子工作进程,结果也始终列出客户端可见的进程 ID(即 pg_backend_pid 的结果)。因此,结果中可能出现重复的 PID。另外,如果持有冲突锁的是一个预备事务,该函数会在结果中用进程 ID 0 表示它。频繁调用此函数可能影响数据库性能,因为它需要短暂地独占访问锁管理器的共享状态。

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

pg_current_logfiletext 返回日志收集器当前使用的日志文件路径。路径包括 log_directory 目录和日志文件名。必须启用日志收集,否则返回值为 NULL。当存在多个格式不同的日志文件时,不带参数调用 pg_current_logfile 会按 stderrcsvlog 的顺序查找,返回找到的第一个格式的文件路径。如果没有任何日志文件采用这些格式,则返回 NULL。要请求特定文件格式,可向可选参数传入 text 类型的 csvlogstderr。如果请求的日志格式未配置在 log_destination 中,返回值为 NULLpg_current_logfile 反映 current_logfiles 文件的内容。

pg_my_temp_schema 返回当前会话的临时模式的 OID;如果没有临时模式(因为尚未创建任何临时表),则返回零。如果给定 OID 是另一个会话的临时模式的 OID,pg_is_other_temp_schema 返回真。(这可以用于从系统目录显示结果中排除其他会话的临时表等场景。)

pg_listening_channels 返回当前会话正在监听的异步通知通道名称集合。pg_notification_queue_usage 返回待处理通知当前占用的空间占通知总可用空间的比例,是一个范围为 0-1 的 double 值。更多信息请参见LISTENNOTIFY

pg_postmaster_start_time 返回服务器启动的时间,类型为 timestamp with time zone

pg_safe_snapshot_blocking_pids 返回一个数组,包含阻止指定进程 ID 对应的服务器进程获取安全快照的会话进程 ID;如果不存在这样的服务器进程,或该进程未被阻塞,则返回空数组。运行 SERIALIZABLE 事务的会话会阻止 SERIALIZABLE READ ONLY DEFERRABLE 事务获取快照,直到后者确定可以安全地不获取任何谓词锁。关于可序列化事务和可延迟事务的更多信息,请参见Section 13.2.3。频繁调用此函数可能影响数据库性能,因为它需要短暂访问谓词锁管理器的共享状态。

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

Table 9.64列出了允许用户以编程方式查询对象访问权限的函数。关于权限的更多信息,请参见Section 5.7

Table 9.64. 访问权限查询函数

名称 返回类型 描述
has_any_column_privilege(user, table, privilege) boolean 用户是否对表的任意列具有权限
has_any_column_privilege(table, privilege) boolean 当前用户是否对表的任意列具有权限
has_column_privilege(user, table, column, privilege) boolean 用户是否具有列权限
has_column_privilege(table, column, privilege) boolean 当前用户是否具有列权限
has_database_privilege(user, database, privilege) boolean 用户是否具有数据库权限
has_database_privilege(database, privilege) boolean 当前用户是否具有数据库权限
has_foreign_data_wrapper_privilege(user, fdw, privilege) boolean 用户是否具有外部数据包装器权限
has_foreign_data_wrapper_privilege(fdw, privilege) boolean 当前用户是否具有外部数据包装器权限
has_function_privilege(user, function, privilege) boolean 用户是否具有函数权限
has_function_privilege(function, privilege) boolean 当前用户是否具有函数权限
has_language_privilege(user, language, privilege) boolean 用户是否具有语言权限
has_language_privilege(language, privilege) boolean 当前用户是否具有语言权限
has_schema_privilege(user, schema, privilege) boolean 用户是否具有模式权限
has_schema_privilege(schema, privilege) boolean 当前用户是否具有模式权限
has_sequence_privilege(user, sequence, privilege) boolean 用户是否具有序列权限
has_sequence_privilege(sequence, privilege) boolean 当前用户是否具有序列权限
has_server_privilege(user, server, privilege) boolean 用户是否具有外部服务器权限
has_server_privilege(server, privilege) boolean 当前用户是否具有外部服务器权限
has_table_privilege(user, table, privilege) boolean 用户是否具有表权限
has_table_privilege(table, privilege) boolean 当前用户是否具有表权限
has_tablespace_privilege(user, tablespace, privilege) boolean 用户是否具有表空间权限
has_tablespace_privilege(tablespace, privilege) boolean 当前用户是否具有表空间权限
has_type_privilege(user, type, privilege) boolean 用户是否具有类型权限
has_type_privilege(type, privilege) boolean 当前用户是否具有类型权限
pg_has_role(user, role, privilege) boolean 用户是否具有角色权限
pg_has_role(role, privilege) boolean 当前用户是否具有角色权限
row_security_active(table) boolean 该表的行级安全性是否对当前用户生效

has_table_privilege检查用户是否可以以某种方式访问表。用户参数可以是名称、OID(pg_authid.oid), public(表示 PUBLIC 伪角色);如果省略该参数,则使用current_user。表可以通过名称或 OID 指定。(因此,has_table_privilege实际上有六种变体,可以通过参数的数量和类型来区分。)通过名称指定时,如有需要,可以用模式限定名称。所需访问权限类型由文本字符串指定,其值必须为以下值之一:SELECTINSERTUPDATEDELETETRUNCATEREFERENCES,或TRIGGER。还可以添加WITH GRANT OPTION到权限类型后,以检查该权限是否附带授予选项。也可以用逗号分隔列出多个权限类型;只要拥有列出的任一权限,结果就为true。(权限字符串不区分大小写,权限名之间允许有额外的空白,但权限名内部不允许。)下面是一些示例:

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

has_sequence_privilege 检查用户是否可以以某种方式访问序列。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 USAGESELECTUPDATE 之一。

has_any_column_privilege 检查用户是否可以以某种方式访问表的任意列。其参数形式与 has_table_privilege 类似,但所需访问权限类型必须为 SELECTINSERTUPDATEREFERENCES 的某种组合。注意,在表级别拥有这些权限中的任意一种,就隐式地对表的每一列拥有该权限,因此对于相同参数,如果 has_table_privilege 返回 truehas_any_column_privilege 也总是返回真。但是,只要至少有一列获得该权限的列级授权,has_any_column_privilege 也会成功。

has_column_privilege 检查用户是否可以以某种方式访问列。其参数形式与 has_table_privilege 类似,但还可以通过列名或属性编号指定列。所需访问权限类型必须为 SELECTINSERTUPDATEREFERENCES 的某种组合。注意,在表级别拥有这些权限中的任意一种,就隐式地对表的每一列拥有该权限。

has_database_privilege 检查用户是否可以以某种方式访问数据库。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 CREATECONNECTTEMPORARYTEMP(等同于 TEMPORARY)的某种组合。

has_function_privilege检查用户是否可以以某种方式访问函数。其参数形式类似于has_table_privilege。通过文本字符串而不是 OID 指定函数时,允许的输入与regprocedure数据类型相同(参见Section 8.19)。所需访问权限类型必须为EXECUTE。例如:

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

has_foreign_data_wrapper_privilege 检查用户是否可以以某种方式访问外部数据包装器。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 USAGE

has_language_privilege 检查用户是否可以以某种方式访问过程语言。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 USAGE

has_schema_privilege 检查用户是否可以以某种方式访问模式。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 CREATEUSAGE 的某种组合。

has_server_privilege 检查用户是否可以以某种方式访问外部服务器。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 USAGE

has_tablespace_privilege 检查用户是否可以以某种方式访问表空间。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 CREATE

has_type_privilege 检查用户是否可以以某种方式访问类型。其参数形式与 has_table_privilege 类似。通过文本字符串而不是 OID 指定类型时,允许的输入与 regtype 数据类型相同(参见Section 8.19)。所需访问权限类型必须为 USAGE

pg_has_role 检查用户是否可以以某种方式访问角色。其参数形式与 has_table_privilege 类似,但不允许使用 public 作为用户名。所需访问权限类型必须为 MEMBERUSAGE 的某种组合。MEMBER 表示直接或间接地属于该角色(即有权执行 SET ROLE),而 USAGE 表示无需执行 SET ROLE 就能立即使用该角色的权限。可以在这两种权限类型后添加 WITH ADMIN OPTIONWITH GRANT OPTION,以检查是否拥有 ADMIN 权限(四种写法检查的是同一件事)。

row_security_active 检查在 current_user 和当前环境的上下文中,指定表的行级安全性是否生效。可以通过名称或 OID 指定表。

Table 9.65 显示了aclitem类型的可用操作符,它是访问权限的目录表示。 有关如何读取访问权限值的信息,请参阅 Section 5.7

Table 9.65. aclitem 操作符

操作符 描述 示例 结果
= 等于 'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem f
@> 包含元素 '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*w/hobbes'::aclitem t
~ 包含元素 '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*w/hobbes'::aclitem t

Table 9.66 显示了一些额外的函数来管理aclitem类型。

Table 9.66. aclitem 函数

名称 返回类型 描述
acldefault(type, ownerId) aclitem[] 获取属于 ownerId 的对象的默认访问权限
aclexplode(aclitem[]) setof record aclitem 数组作为元组返回
makeaclitem(grantee, grantor, privilege, grantable) aclitem 根据输入构造 aclitem

acldefault 返回属于角色 ownerId、类型为 type 的对象的内置默认访问权限。当对象的 ACL 条目为空值时,会采用这些访问权限。(默认访问权限见Section 5.7。)type 参数的类型为 CHAR:'c' 表示 COLUMN,'r' 表示 TABLE 和类似表的对象,'s' 表示 SEQUENCE,'d' 表示 DATABASE,'f' 表示 FUNCTIONPROCEDURE,'l' 表示 LANGUAGE,'L' 表示 LARGE OBJECT,'n' 表示 SCHEMA,'t' 表示 TABLESPACE,'F' 表示 FOREIGN DATA WRAPPER,'S' 表示 FOREIGN SERVER,'T' 表示 TYPEDOMAIN

aclexplode 将一个 aclitem 数组返回为行集合。输出列依次为授予者的 oid、受让者的 oid0 表示 PUBLIC)、以 text 表示的所授予权限(SELECT 等),以及以 boolean 表示的该权限是否可以转授。makeaclitem 执行相反的操作。

Table 9.67列出了判断某个特定对象是否可见的函数,其判断依据是当前模式搜索路径。例如,如果表所在的模式位于搜索路径中,并且在搜索路径的更前面没有同名表,就称该表可见。这等价于说,可以只通过表名引用该表,而不必显式地用模式限定。要列出所有可见表的名称:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Table 9.67. 模式可见性查询函数

名称 返回类型 描述
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 类型(或域)是否在搜索路径中可见

每个函数检查一种数据库对象的可见性。注意,pg_table_is_visible 也可用于视图、物化视图、索引、序列和外部表;pg_function_is_visible 也可用于过程和聚合;pg_type_is_visible 也可用于域。对于函数和操作符,如果搜索路径更前面没有名称和参数数据类型都相同的对象,那么路径中的该对象就是可见的。对于操作符类,会同时考虑名称和关联的索引访问方法。

所有这些函数都需要用对象 OID 标识要检查的对象。如果想按名称测试对象,使用 OID 别名类型会很方便(regclassregtyperegprocedureregoperatorregconfig,或regdictionary),例如:

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

注意,用这种方式测试不带模式限定的类型名并没有太大意义:只要该名称能够被识别,它就必然可见。

Table 9.68 列出从系统目录中提取信息的函数。

Table 9.68. 系统目录信息函数

名称 返回类型 描述
format_type(type_oid, typemod) text 获取数据类型的 SQL 名称
pg_get_constraintdef(constraint_oid) text 获取约束定义
pg_get_constraintdef(constraint_oid, pretty_bool) text 获取约束定义
pg_get_expr(pg_node_tree, relation_oid) text 反编译表达式的内部形式,假定其中所有 Var 都引用第二个参数指定的关系
pg_get_expr(pg_node_tree, relation_oid, pretty_bool) text 反编译表达式的内部形式,假定其中所有 Var 都引用第二个参数指定的关系
pg_get_functiondef(func_oid) text 获取函数或过程的定义
pg_get_function_arguments(func_oid) text 获取函数或过程定义的参数列表(包含默认值)
pg_get_function_identity_arguments(func_oid) text 获取用于标识函数或过程的参数列表(不含默认值)
pg_get_function_result(func_oid) text 获取函数的 RETURNS 子句(对于过程返回 null)
pg_get_indexdef(index_oid) text 获取索引的 CREATE INDEX 命令
pg_get_indexdef(index_oid, column_no, pretty_bool) text 获取索引的 CREATE INDEX 命令;当 column_no 非零时,仅获取一个索引列的定义
pg_get_keywords() setof record 获取 SQL 关键字及其类别的列表
pg_get_ruledef(rule_oid) text 获取规则的 CREATE RULE 命令
pg_get_ruledef(rule_oid, pretty_bool) text 获取规则的 CREATE RULE 命令
pg_get_serial_sequence(table_name, column_name) text 获取 serial 列或标识列使用的序列名称
pg_get_statisticsobjdef(statobj_oid) text 获取扩展统计信息对象的 CREATE STATISTICS 命令
pg_get_triggerdef(trigger_oid) text 获取触发器的 CREATE [ CONSTRAINT ] TRIGGER 命令
pg_get_triggerdef(trigger_oid, pretty_bool) text 获取触发器的 CREATE [ CONSTRAINT ] TRIGGER 命令
pg_get_userbyid(role_oid) name 获取具有给定 OID 的角色名称
pg_get_viewdef(view_name) text 获取视图或物化视图的底层 SELECT 命令(已弃用
pg_get_viewdef(view_name, pretty_bool) text 获取视图或物化视图的底层 SELECT 命令(已弃用
pg_get_viewdef(view_oid) text 获取视图或物化视图的底层 SELECT 命令
pg_get_viewdef(view_oid, pretty_bool) text 获取视图或物化视图的底层 SELECT 命令
pg_get_viewdef(view_oid, wrap_column_int) text 获取视图或物化视图的底层 SELECT 命令;包含字段的行按指定列数折行,并隐含启用美化输出
pg_index_column_has_property(index_oid, column_no, prop_name) boolean 测试索引列是否具有指定属性
pg_index_has_property(index_oid, prop_name) boolean 测试索引是否具有指定属性
pg_indexam_has_property(am_oid, prop_name) boolean 测试索引访问方法是否具有指定属性
pg_options_to_table(reloptions) setof record 获取存储选项的名称/值对集合
pg_tablespace_databases(tablespace_oid) setof oid 获取在该表空间中具有对象的数据库 OID 集合
pg_tablespace_location(tablespace_oid) text 获取该表空间在文件系统中的路径
pg_typeof(any) regtype 获取任意值的数据类型
collation for (any) text 获取参数的排序规则
to_regclass(rel_name) regclass 获取指定名称关系的 OID
to_regproc(func_name) regproc 获取指定名称函数的 OID
to_regprocedure(func_name) regprocedure 获取指定名称函数的 OID
to_regoper(operator_name) regoper 获取指定名称操作符的 OID
to_regoperator(operator_name) regoperator 获取指定名称操作符的 OID
to_regtype(type_name) regtype 获取指定名称类型的 OID
to_regnamespace(schema_name) regnamespace 获取指定名称模式的 OID
to_regrole(role_name) regrole 获取指定名称角色的 OID

format_type 返回数据类型的 SQL 名称,该类型由其类型 OID 和可能存在的类型修饰符标识。如果不知道具体的类型修饰符,请为类型修饰符参数传入 NULL。

pg_get_keywords 返回一组记录,描述服务器识别的 SQL 关键字。word 列包含关键字。catcode 列包含类别代码:U 表示非保留关键字,C 表示列名,T 表示类型名或函数名,R 表示保留关键字。catdesc 列包含描述该类别的字符串,该字符串可能已经过本地化。

pg_get_constraintdefpg_get_indexdefpg_get_ruledefpg_get_statisticsobjdefpg_get_triggerdef 分别重建约束、索引、规则、扩展统计对象或触发器的创建命令。(注意,这是通过反编译重建的,并非命令的原始文本。)pg_get_expr 反编译单个表达式的内部形式,例如列的默认值。这在检查系统目录内容时可能很有用。如果表达式可能包含 Vars,请将它们所引用的关系的 OID 指定为第二个参数;如果预计不含 Vars,传入零即可。pg_get_viewdef 重建定义视图的 SELECT 查询。这些函数中的大多数有两种变体,其中一种可以选择美化输出结果。美化格式更易读,但默认格式更可能被未来版本的 PostgreSQL 以相同方式解释;转储时应避免使用美化输出。向美化输出参数传入 false,所得结果与完全没有该参数的变体相同。

pg_get_functiondef 返回一个函数的完整 CREATE OR REPLACE FUNCTION 语句。pg_get_function_argumentsCREATE FUNCTION 中所需的形式返回函数参数列表。pg_get_function_result 类似地返回该函数相应的 RETURNS 子句。pg_get_function_identity_arguments 返回标识函数所需的参数列表,例如以 ALTER FUNCTION 中所需的形式返回。此形式省略默认值。

pg_get_serial_sequence返回与列关联的序列名称;如果该列没有关联序列,则返回 NULL。如果列是标识列,关联序列就是为标识列在内部创建的序列。对于使用某种串行类型(serialsmallserialbigserial)创建的列,关联序列就是为该串行列定义创建的序列。在后一种情况下,可以使用ALTER SEQUENCE OWNED BY修改或移除这种关联。(该函数也许应该叫作pg_get_owned_sequence;它当前的名称反映了它通常用于serialbigserial列这一事实。)第一个输入参数是可以带有模式名的表名,第二个参数是列名。由于第一个参数可能包含模式和表,它不会被当作双引号括起的标识符处理,因此默认转换为小写;第二个参数只包含列名,会被当作带双引号的标识符处理并保留大小写。函数返回的值采用适于传递给序列函数的格式(参见Section 9.16)。典型用法是读取标识列或串行列的序列当前值,例如:

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

pg_get_userbyid 根据给定 OID 获取角色名称。

pg_index_column_has_propertypg_index_has_propertypg_indexam_has_property 返回指定的索引列、索引或索引访问方法是否具有给定名称的属性。如果属性名未知或不适用于该对象,或者 OID 或列号不能标识有效对象,则返回 NULL。列属性见Table 9.69,索引属性见Table 9.70,访问方法属性见Table 9.71。(注意,扩展提供的访问方法可以为其索引定义额外的属性名。)

Table 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搜索?

Table 9.70. 索引性质

名称 描述
clusterable 索引是否可以用于CLUSTER命令?
index_scan 索引是否支持普通扫描(非位图)?
bitmap_scan 索引是否支持位图扫描?
backward_scan 在扫描中扫描方向能否被更改(为了支持游标上无需物化的FETCH BACKWARD)?

Table 9.71. 索引访问方法性质

名称 描述
can_order 访问方法是否支持ASCDESC以及CREATE INDEX中的有关关键词?
can_unique 访问方法是否支持唯一索引?
can_multi_col 访问方法是否支持多列索引?
can_exclude 访问方法是否支持排除约束?
can_include 访问方法是否支持CREATE INDEXINCLUDE子句?

pg_options_to_table 传入 pg_class.reloptionspg_attribute.attoptions 时,它返回存储选项名称/值对(option_name/option_value)的集合。

pg_tablespace_databases 用于检查表空间。它返回在该表空间中存储了对象的数据库 OID 集合。如果此函数返回任何行,则说明该表空间不为空,不能删除。要显示存放在该表空间中的具体对象,需要连接到 pg_tablespace_databases 标识的数据库,并查询它们的 pg_class 系统目录。

pg_typeof返回所传入值的数据类型的 OID。这有助于排查问题或动态构造 SQL 查询。函数声明的返回类型是regtype,它是一种 OID 别名类型(参见Section 8.19);这意味着它在比较时与 OID 相同,但显示为类型名。例如:

SELECT pg_typeof(33);

 pg_typeof 
-----------
 integer
(1 row)

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

表达式collation for返回所传入值的排序规则。例如:

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

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

返回值可能带有引号和模式限定。如果不能为参数表达式推导出排序规则,则返回空值。如果参数的数据类型不支持排序规则,则会报错。

to_regclassto_regprocto_regprocedureto_regoperto_regoperatorto_regtypeto_regnamespaceto_regrole 函数将以 text 给出的关系、函数、操作符、类型、模式和角色名称,分别转换为 regclassregprocregprocedureregoperregoperatorregtyperegnamespaceregrole 类型的对象。这些函数与从文本进行类型转换的区别是:它们不接受数值 OID,而且在找不到名称时(对于 to_regprocto_regoper,还包括给定名称匹配多个对象时)返回空值,而不会报错。

Table 9.72列出了与数据库对象 标识和定位有关的函数。

Table 9.72. 对象信息和定位函数

名称 返回类型 描述
pg_describe_object(classid oid, objid oid, objsubid integer) text 获取数据库对象的描述
pg_identify_object(classid oid, objid oid, objsubid integer) type text, schema text, name text, identity text 获取数据库对象的标识
pg_identify_object_as_address(classid oid, objid oid, objsubid integer) type text, object_names text[], object_args text[] 获取数据库对象地址的外部表示
pg_get_object_address(type text, object_names text[], object_args text[]) classid oid, objid oid, objsubid integer 根据外部表示获取数据库对象的地址

pg_describe_object 返回数据库对象的文本描述,对象由系统目录 OID、对象 OID 和子对象 ID 指定(例如表中的列号;引用整个对象时,子对象 ID 为零)。该描述供人阅读,并可能根据服务器配置被翻译。这有助于确定存储在 pg_depend 系统目录中的对象身份。

pg_identify_object 返回一行,其中包含足以唯一标识数据库对象的信息,该对象由系统目录 OID、对象 OID 和子对象 ID 指定。这些信息供机器读取,永远不会被翻译。type 标识数据库对象的类型;schema 是对象所属的模式名,对于不属于模式的对象类型则为 NULL;如果对象名(以及适用时的模式名)足以唯一标识该对象,name 就是对象名,并在必要时加引号,否则为 NULLidentity 是完整的对象标识,其具体格式取决于对象类型,格式中的每个名称都会根据需要加上模式限定和引号。

pg_identify_object_as_address 返回一行,其中包含足以唯一标识数据库对象的信息,该对象由系统目录 OID、对象 OID 和子对象 ID 指定。返回的信息与当前服务器无关,也就是说,它也能用于标识另一台服务器上名称相同的对象。type 标识数据库对象的类型;object_namesobject_args 是文本数组,共同构成对该对象的引用。将这三个值传给 pg_get_object_address 可以获得对象的内部地址。此函数执行 pg_get_object_address 的逆操作。

pg_get_object_address 返回一行,其中包含足以唯一标识数据库对象的信息,该对象由其类型、对象名称数组和参数数组指定。返回的值就是 pg_depend 等系统目录中使用的值,也可以传给 pg_identify_objectpg_describe_object 等其他系统函数。classid 是包含该对象的系统目录的 OID;objid 是对象自身的 OID;objsubid 是子对象 ID,没有子对象时为零。此函数执行 pg_identify_object_as_address 的逆操作。

Table 9.73中展示的函数抽取注释,注释是由COMMENT命令在以前存储的。如果对指定参数找不到注释,则返回空值。

Table 9.73. 注释信息函数

名称 返回类型 描述
col_description(table_oid, column_number) text 获取表列的注释
obj_description(object_oid, catalog_name) text 获取数据库对象的注释
obj_description(object_oid) text 获取数据库对象的注释(已弃用
shobj_description(object_oid, catalog_name) text 获取共享数据库对象的注释

col_description 返回表列的注释,列由所属表的 OID 和列号指定。(obj_description 不能用于表列,因为列没有自身的 OID。)

obj_description 的双参数形式返回数据库对象的注释,对象由其 OID 和所在系统目录的名称指定。例如,obj_description(123456,'pg_class') 会获取 OID 为 123456 的表的注释。obj_description 的单参数形式只需要对象 OID。该形式已被弃用,因为无法保证 OID 在不同系统目录之间唯一,因而可能返回错误的注释。

shobj_description 的用法与 obj_description 相同,但用于获取共享对象的注释。有些系统目录由数据库集簇中的所有数据库全局共享,其中对象的描述也全局存储。

Table 9.74中的函数以可导出的形式提供服务器事务信息。这些函数主要用于确定两个快照之间有哪些事务提交。

Table 9.74. 事务 ID 和快照

名称 返回类型 描述
txid_current() bigint 获取当前事务 ID;如果当前事务尚无 ID,则分配一个新的 ID
txid_current_if_assigned() bigint txid_current() 相同,但尚未分配事务 ID 时返回 null,而不是分配新的事务 ID
txid_current_snapshot() txid_snapshot 获取当前快照
txid_snapshot_xip(txid_snapshot) setof bigint 获取快照中正在进行的事务 ID
txid_snapshot_xmax(txid_snapshot) bigint 获取快照的 xmax
txid_snapshot_xmin(txid_snapshot) bigint 获取快照的 xmin
txid_visible_in_snapshot(bigint, txid_snapshot) boolean 该事务 ID 是否在快照中可见?(不要用于子事务 ID)
txid_status(bigint) text 报告给定事务的状态:committedabortedin progress;如果事务 ID 太旧,则为 null

内部事务 ID 类型(xid)为 32 位,每经过约 40 亿个事务就会回卷一次。不过,这些函数导出的是用纪元计数器扩展的 64 位格式,在一次安装的整个使用期间都不会回卷。这些函数使用的 txid_snapshot 数据类型存储某一时刻的事务 ID 可见性信息。其组成部分见Table 9.75

Table 9.75. 快照组件

名称 描述
xmin 仍然活动的最早事务 ID(txid)。所有更早的事务要么已经提交且可见,要么已经回滚而失效。
xmax 第一个尚未分配的 txid。所有大于或等于此值的 txid 在快照时尚未开始,因此不可见。
xip_list 快照时活动的 txid。该列表仅包含 xminxmax 之间的活动 txid;可能存在大于 xmax 的活动 txid。满足 xmin <= txid < xmax 且不在此列表中的 txid 在快照时已经完成,因此根据其提交状态,要么可见,要么失效。该列表不包含子事务的 txid。

txid_snapshot 的文本表示为 xmin:xmax:xip_list。例如,10:20:10,14,15 表示 xmin=10, xmax=20, xip_list=10, 14, 15

txid_status(bigint) 报告近期事务的提交状态。如果在 COMMIT 进行过程中应用与数据库服务器断开连接,应用可以用它判断事务是提交了还是中止了。只要事务足够新,系统仍保留其提交状态,就会将状态报告为 in progresscommittedaborted。如果事务已足够旧,系统中不再有对它的引用,且提交状态信息已被丢弃,则此函数返回 NULL。注意,预备事务被报告为 in progress;如果需要确定某个 txid 是否为预备事务,应用必须检查 pg_prepared_xacts

Table 9.76中的函数提供已提交事务的信息,主要是事务何时提交。只有启用 track_commit_timestamp 配置选项后,这些函数才会提供有用的数据,并且只针对启用该选项之后提交的事务。

Table 9.76. 已提交事务信息

名称 返回类型 描述
pg_xact_commit_timestamp(xid) timestamp with time zone 获取事务的提交时间戳
pg_last_committed_xact() xid xid, timestamp timestamp with time zone 获取最近提交事务的事务 ID 和提交时间戳

Table 9.77中的函数显示在 initdb 期间初始化的信息,例如系统目录版本。它们也显示有关预写式日志和检查点处理的信息。这些信息适用于整个数据库集簇,而非某个特定数据库。它们与 pg_controldata 从相同来源提供大部分相同的信息,但采用更适合 SQL 函数的形式。

Table 9.77. 控制数据函数

名称 返回类型 描述
pg_control_checkpoint() record 返回当前检查点状态的信息。
pg_control_system() record 返回当前控制文件状态的信息。
pg_control_init() record 返回集簇初始化状态的信息。
pg_control_recovery() record 返回恢复状态的信息。

pg_control_checkpoint 返回一条记录,其内容见Table 9.78

Table 9.78. 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

pg_control_system 返回一条记录,其内容见Table 9.79

Table 9.79. pg_control_system 输出列

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

pg_control_init 返回一条记录,其内容见Table 9.80

Table 9.80. 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
float4_pass_by_value boolean
float8_pass_by_value boolean
data_page_checksum_version integer

pg_control_recovery 返回一条记录,其内容见Table 9.81

Table 9.81. 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