9.27. 系统信息函数和操作符 #
本节描述的函数用于获取有关 PostgreSQL 安装的各种信息。
9.27.1. 会话信息函数 #
表 9.69 列出了多个用于提取会话和系统信息的函数。
除了本节列出的函数外,还有许多与统计系统相关的函数,这些函数也提供系统信息。有关更多信息,请参见第 27.2.26 节。
表 9.69. 会话信息函数
函数 描述 |
|---|
|
返回当前数据库的名称。(SQL 标准将数据库称为“目录(catalogs)”,因此 |
|
返回客户端提交的当前正在执行的查询文本(可能包含多条语句)。 |
|
这个等同于 |
|
返回在搜索路径中的第一个模式的名称(如果搜索路径为空则返回空值)。这个模式将用于没有指定目标模式就创建的任何表或其他已命名对象。 |
返回当前有效搜索路径中所有模式名称的数组,按优先级排序。(当前 search_path 设置中不对应于已存在且可搜索的模式的项会被省略。)如果布尔参数为 |
|
返回当前执行上下文的用户名。 |
|
返回当前客户端的 IP 地址;如果当前连接通过 Unix 域套接字建立,则返回 |
|
返回当前客户端的 IP 端口号,如果当前连接是通过 Unix 域套接字则返回 |
|
返回服务器接受当前连接的 IP 地址,如果当前连接是通过 Unix 域套接字则返回 |
|
返回服务器接受当前连接的 IP 端口号,如果当前连接是通过 Unix 域套接字则返回 |
|
返回附加到当前会话的服务器进程的进程 ID。 |
返回一个数组,包含阻止指定进程 ID 对应的服务器进程获取锁的会话进程 ID;如果不存在这样的服务器进程,或该进程未被阻塞,则返回空数组。
一个服务器进程会在以下情况下阻塞另一个进程:它持有与被阻塞进程请求的锁冲突的锁(硬阻塞);或者它正在等待一个会与被阻塞进程请求的锁冲突的锁,并且在等待队列中位于被阻塞进程之前(软阻塞)。使用并行查询时,即使实际持锁或等待锁的是子工作进程,结果也始终列出客户端可见的进程 ID(即 频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要在短时间内独占访问锁管理器的共享状态。 |
返回服务器配置文件最近一次加载的时间。如果当时当前会话已经存在,则返回该会话自身重新读取配置文件的时间(因此不同会话中的返回时间会略有不同)。否则,返回 postmaster 进程重新读取配置文件的时间。 |
返回当前由日志收集器使用的日志文件的路径名。路径包括 log_directory 目录和单独的日志文件名。如果日志收集器已禁用,则结果为
默认情况下,此函数仅限超级用户和具有 |
|
返回当前会话的临时模式的 OID,如果没有则返回 0(因为它没有创建任何临时表)。 |
如果给定的 OID 是另一个会话的临时模式的 OID 则返回真。(这可能是有用的,例如,在目录显示中排除其他会话的临时表。) |
返回当前会话正在侦听的异步通知通道的名称集。 |
返回服务器启动时的时间。 |
返回一个数组,包含阻止指定进程 ID 对应的服务器进程获取安全快照的会话进程 ID;如果不存在这样的服务器进程,或该进程未被阻塞,则返回空数组。
运行 频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要在短时间内访问谓词锁管理器的共享状态。 |
|
返回 PostgreSQL 触发器的当前嵌套层级(如果不是从触发器内部直接或间接调用,则为 0)。 |
|
返回会话用户名。 |
|
返回用户在被分配数据库角色之前,于认证周期中提供的认证方法和身份(如果有)。结果表示为 |
|
这个相当于 |
注意
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. 访问权限查询函数
函数 描述 |
|---|
用户是否对表的至少一列具有权限?如果拥有整个表的权限,或至少一列获得了该权限的列级授权,则返回真。允许的权限类型为 |
用户对指定的表列有权限么?如果对整个表持有权限,或者对列授予了列级别的权限,则会成功。可以通过名称或属性编号( |
用户对数据库有权限吗?允许的权限类型为 |
用户是否具有外部数据包装器权限?唯一允许的权限类型为 |
用户对函数有权限吗?唯一允许的权限类型是
当通过名称而不是 OID 指定函数时,允许的输入与 SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
|
用户对语言有权限吗?唯一允许的权限类型是 |
用户是否具有配置参数的权限?参数名称不区分大小写。允许的权限类型为 |
用户对模式有权限吗?允许的权限类型是 |
用户是否具有序列权限?允许的权限类型为 |
用户是否对外部服务器有权限?唯一允许的权限类型是 |
用户对表有权限吗?允许的权限类型有 |
用户对表空间有权限吗?唯一允许的权限类型是 |
用户对数据类型有权限吗?唯一允许的权限类型是 |
用户是否具有角色权限?允许的权限类型为 |
在当前用户和当前环境的上下文中,指定表的行级安全是否生效? |
表 9.71 列出了 aclitem 类型可用的操作符;该类型是访问权限在系统目录中的表示形式。有关如何解读访问权限值的信息,请参见第 5.8 节。
表 9.71. aclitem 操作符
表 9.72 列出了一些用于管理 aclitem 类型的其他函数。
表 9.72. aclitem 函数
函数 描述 |
|---|
构造一个 |
以行集的形式返回 |
使用给定的属性构造 |
9.27.3. 模式可见性查询函数 #
表 9.73 列出了判断某个特定对象是否可见的函数,其判断依据是当前模式搜索路径。例如,如果表所在的模式位于搜索路径中,并且在搜索路径的更前面没有同名表,就称该表可见。这等价于说,可以只通过表名引用该表,而不必显式地用模式限定。因此,要列出所有可见表的名称:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
对于函数和操作符,只要搜索路径中更靠前的位置没有对象具有与被检查对象相同的名称和参数数据类型,就称被检查对象可见。对于操作符类和操作符族,会同时考虑名称及关联的索引访问方法。
表 9.73. 模式可见性查询函数
所有这些函数都需要用对象 OID 标识要检查的对象。如果想按名称测试对象,使用 OID 别名类型会很方便(regclass,regtype,regprocedure,regoperator,regconfig,或 regdictionary),例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
注意,用这种方式测试不带模式限定的类型名并没有太大意义:只要该名称能够被识别,它就必然可见。
9.27.4. 系统目录信息函数 #
表 9.74 列出从系统目录中提取信息的函数。
表 9.74. 系统目录信息函数
函数 描述 |
|---|
返回由其类型 OID 和可能的类型修饰符标识的数据类型的 SQL 名称。如果没有已知的类型修饰符,则传递 NULL 值给类型修饰符。 |
返回由类型 OID 标识的域的基础类型 OID。如果参数是非域类型的 OID,则原样返回该参数。如果参数不是有效的类型 OID,则返回 NULL。如果存在域依赖链,则递归查找,直到找到基础类型。
假设执行了
|
将提供的编码名称转换为表示在某些系统目录表中使用的内部标识符的整数。如果提供了未知的编码名称,则返回 |
将在某些系统目录表中用作编码内部标识符的整数转换为可读的字符串。如果提供了无效的编码编号,则返回空字符串。 |
返回一组记录,描述存在于 PostgreSQL 系统目录中的外键关系。 |
重建约束的创建命令。(这是反编译重建的结果,并非命令的原始文本。) |
反编译存储在系统目录中的表达式的内部形式,例如列的默认值。如果表达式可能包含 Var 节点,请将它们所引用的关系的 OID 指定为第二个参数;如果预计不含 Var 节点,传入零即可。 |
重建函数或过程的创建命令。(这是反编译重建的结果,并非命令的原始文本。)结果是一条完整的 |
重建函数或过程的参数列表,采用其在 |
重建标识函数或过程所需的参数列表,采用其在 |
重建函数的 |
重建索引的创建命令。(这是反编译重建的结果,并非命令的原始文本。)如果提供了 |
返回描述服务器所识别 SQL 关键字的一组记录。 |
重建分区约束的定义。(这是反编译重建的结果,并非命令的原始文本。) |
重建分区表的分区键定义,采用其在 |
重建规则的创建命令。(这是反编译重建的结果,并非命令的原始文本。) |
返回与列相关联的序列名称,如果没有序列与该列相关联则返回 NULL。如果列是标识列,则关联序列是在内部为该列创建的序列。对于使用一种 serial 类型( 典型用法是读取标识列或 serial 列所用序列的当前值,例如: SELECT currval(pg_get_serial_sequence('sometable', 'id'));
|
重建扩展统计对象的创建命令。(这是反编译重建的结果,并非命令的原始文本。) |
重建触发器的创建命令。(这是反编译重建的结果,并非命令的原始文本。) |
根据 OID 返回角色名。 |
重建定义视图或物化视图的 |
重建定义视图或物化视图的 |
根据视图的文本名称而不是其 OID,重建定义视图或物化视图的 |
测试一个索引列是否具有指定名称的属性。表 9.75 列出了常用索引列属性。(注意,扩展访问方法可以为其索引定义额外的属性名。)如果属性名未知或不适用于特定对象,或者 OID 或列号不能识别有效的对象,则返回 |
测试一个索引是否具有指定名称的属性。表 9.76 列出了常用的索引属性。(注意,扩展访问方法可以为其索引定义额外的属性名。)如果属性名未知或不适用于特定对象,或者 OID 不能识别有效的对象,则返回 |
测试索引访问方法是否具有指定名称的属性。访问方法属性如表 9.77 所示。如果属性名未知或不适用于特定对象,或者 OID 不能识别有效的对象,则返回 |
返回源自 |
返回与给定 GUC 关联的标志数组;如果该 GUC 不存在,则返回 |
返回在指定表空间中存储了对象的数据库 OID 集合。如果此函数返回任何行,则说明该表空间不为空,不能删除。要查看存放在该表空间中的具体对象,需要连接到 |
返回表空间所在的文件系统路径。 |
|
返回所传入值的数据类型的 OID。这有助于排查问题或动态构造 SQL 查询。函数声明的返回类型是
|
返回传入值的排序规则名称。必要时会为返回的名称加上引号和模式限定。如果无法为参数表达式推导出排序规则,则返回
|
将文本关系名转换为它的 OID。通过将字符串类型转换为 |
将文本排序规则名称转换为它的 OID。通过将字符串类型转换为 |
将文本模式名转换为它的 OID。通过将字符串转换为 |
|
将文本操作符名称转换为它的 OID。通过将字符串类型转换为 |
将文本操作符名称(带有参数类型)转换为其 OID。通过将字符串转换为 |
|
将文本函数或过程名转换为其 OID。通过将字符串转换为 |
将文本函数或过程名(带有参数类型)转换为其 OID。通过将字符串类型转换为 |
|
将文本角色名转换为它的 OID。通过将字符串类型转换为 |
|
解析文本字符串,从中提取可能的类型名,并将该名称转换为类型 OID。字符串中的语法错误会导致报错;但如果字符串是语法有效的类型名,只是在系统目录中找不到该类型,结果就是 |
解析文本字符串,从中提取可能的类型名称,并转换其类型修饰符(如果有)。字符串中的语法错误会引发错误;但如果字符串是语法有效的类型名称,只是在系统目录中找不到,则结果为
|
大多数重建(反编译)数据库对象的函数都有一个可选的 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. 对象信息和寻址函数
9.27.6. 注释信息函数 #
表 9.80 中的函数用于提取此前通过 COMMENT 命令存储的注释。如果找不到与指定参数对应的注释,则返回空值。
表 9.80. 注释信息函数
9.27.7. 数据有效性检查函数 #
表 9.81 中所示的函数有助于检查待输入数据的有效性。
表 9.81. 数据有效性检查函数
9.27.8. 事务 ID 和快照信息函数 #
表 9.82 中展示的函数以一种可导出的形式提供了服务器事务信息。这些函数的主要用途是判断在两个快照之间哪些事务被提交。
表 9.82. 事务 ID 和快照信息函数
函数 描述 |
|---|
|
返回给定事务 ID 与当前事务计数器之间的事务数。 |
|
返回给定多事务 ID 与当前多事务计数器之间的多事务 ID 数。 |
|
返回当前事务的 ID。如果当前事务还没有一个 ID(因为它还没有执行任何数据库更新),它将分配一个新的事务 ID;详见第 66.1 节。如果在子事务中执行,它将返回顶层事务的 ID;详见第 66.3 节。 |
返回当前事务的 ID;如果尚未分配 ID,则返回 |
报告近期事务的提交状态。只要事务足够新,系统仍保留其提交状态,结果就为 |
返回当前快照,即显示哪些事务 ID 正在进行中的数据结构。快照中只包含顶层事务 ID,不显示子事务 ID;详见第 66.3 节。 |
返回快照中包含的正在进行的事务 ID 集。 |
返回快照的 |
返回快照的 |
根据此快照,给定的事务 ID 是否可见(即该事务是否在生成快照之前完成)?注意,此函数无法为子事务 ID(subxid)给出正确结果;详见第 66.3 节。 |
返回指定多事务 ID 中每个成员的事务 ID 和锁模式。锁模式 |
内部事务 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_list10: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 <= 且不在此列表中的事务 ID 在生成快照时已经完成,因此根据其提交状态,要么可见,要么失效。此列表不包含子事务的事务 ID(subxid)。
|
在 PostgreSQL13 以前的版本中,没有 xid8 类型,因此提供了这些函数的变体,使用 bigint 表示 64 位 XID,并相应地提供不同的快照数据类型 txid_snapshot。这些旧的函数在它们的名字中有 txid。为保持向后兼容,这些函数仍受支持,但可能会在未来版本中被移除。参见表 9.84。
表 9.84. 已弃用的事务 ID 和快照信息函数
9.27.9. 已提交事务信息函数 #
表 9.85 中的函数提供过去事务的提交时间信息。只有启用 track_commit_timestamp 配置选项后,这些函数才会提供有用的数据,并且只针对启用该选项之后提交的事务。提交时间戳信息会在清理过程中定期移除。
表 9.85. 已提交事务信息函数
9.27.10. 控制数据函数 #
表 9.86 中的函数显示在 initdb 期间初始化的信息,例如系统目录版本。它们也显示有关预写式日志和检查点处理的信息。这些信息适用于整个数据库集簇,而非某个特定数据库。这些函数与 pg_controldata 应用程序从相同来源提供大部分相同的信息。
表 9.86. 控制数据函数
表 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. 版本信息函数
函数 描述 |
|---|
|
返回描述 PostgreSQL
服务器版本的字符串。你还可以从 server_version 获得此信息,或者对于机器可读的版本,使用 server_version_num。软件开发人员应该使用 |
|
返回一个表示 PostgreSQL 所使用的 Unicode 版本的字符串。 |
|
如果服务器在构建时启用了 ICU 支持,则返回一个表示 ICU 所使用的 Unicode
版本的字符串;否则返回
|
9.27.12. WAL 汇总信息函数 #
表 9.92 中所示的函数打印有关 WAL 汇总状态的信息。参见 summarize_wal。
表 9.92. WAL 汇总信息函数
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.