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

9.25. 系统信息函数 #

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

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

Table 9.60. 会话信息函数

名称 返回类型 描述
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_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.61列出了允许用户以编程方式查询对象访问权限的函数。关于权限的更多信息,请参见Section 5.6

Table 9.61. 访问权限查询函数

名称 返回类型 描述
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.18)。所需访问权限类型必须为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.18)。所需访问权限类型必须为 USAGE

pg_has_role 检查用户是否可以以某种方式访问角色。其参数形式与 has_table_privilege 类似,但不允许使用 public 作为用户名。所需访问权限类型必须为 MEMBERUSAGE 的某种组合。MEMBER 表示直接或间接地属于该角色(即有权执行 SET ROLE),而 USAGE 表示无需执行 SET ROLE 就能立即使用该角色的权限。

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

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

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

名称 返回类型 描述
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_type_is_visible 也可用于域。对于函数和操作符,如果搜索路径更前面没有名称和参数数据类型都相同的对象,那么路径中的该对象就是可见的。对于操作符类,会同时考虑名称和关联的索引访问方法。

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

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

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

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

Table 9.63. 系统目录信息函数

名称 返回类型 描述
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 子句
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.64,索引属性见Table 9.65,访问方法属性见Table 9.66。(注意,扩展提供的访问方法可以为其索引定义额外的属性名。)

Table 9.64. 索引列属性

名称 描述
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.65. 索引性质

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

Table 9.66. 索引访问方法性质

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

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.18);这意味着它在比较时与 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.67列出了与数据库对象 标识和定位有关的函数。

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

名称 返回类型 描述
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, name text[], 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.68中展示的函数抽取注释,注释是由COMMENT命令在以前存储的。如果对指定参数找不到注释,则返回空值。

Table 9.68. 注释信息函数

名称 返回类型 描述
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.69中的函数以可导出的形式提供服务器事务信息。这些函数主要用于确定两个快照之间有哪些事务提交。

Table 9.69. 事务 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.70

Table 9.70. 快照组件

名称 描述
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.71中的函数提供已提交事务的信息,主要是事务何时提交。只有启用 track_commit_timestamp 配置选项后,这些函数才会提供有用的数据,并且只针对启用该选项之后提交的事务。

Table 9.71. 已提交事务信息

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

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

Table 9.72. 控制数据函数

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

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

Table 9.73. pg_control_checkpoint 输出列

列名称 数据类型
checkpoint_lsn pg_lsn
prior_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.74

Table 9.74. 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.75

Table 9.75. 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.76

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