9.26. 系统信息函数和运算符#
- 9.26.1. 会话信息函数
- 9.26.2. 访问权限查询函数
- 9.26.3. 模式可见性查询函数
- 9.26.4. 系统目录信息函数
- 9.26.5. 对象信息和寻址函数
- 9.26.6. 注释信息函数
- 9.26.7. 数据有效性检查函数
- 9.26.8. 事务 ID 和快照信息函数
- 9.26.9. 已提交事务信息函数
- 9.26.10. 控制数据函数
本节所述函数用于获取有关PostgreSQL安装的各种信息。
9.26.1. 会话信息函数#
表 9.67显示了几个提取会话和系统信息的函数。
除了本节中列出的函数外,还有许多与统计系统相关的函数也提供系统信息。有关详细信息,请参见第 28.2.25 节。
表 9.67. 会话信息函数
函数 说明 |
---|
返回当前数据库的名称。(在 SQL 标准中,数据库称为 “目录”,因此 |
返回当前执行查询的文本,由客户端提交(可能包含多条语句)。 |
这等同于 |
返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回 null 值)。这是将用于创建任何未指定目标模式的表或其他命名对象的模式。 |
返回当前有效搜索路径中所有模式名称的数组,按其优先级顺序排列。(当前 search_path 设置中与现有可搜索模式不对应的项将被省略。)如果布尔参数为 |
返回当前执行上下文的用户名。 |
返回当前客户端的 IP 地址,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回当前客户端的 IP 端口号,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回服务器接受当前连接的 IP 地址,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回服务器接受当前连接的 IP 端口号,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回附加到当前会话的服务器进程的进程 ID。 |
返回一个进程 ID 数组,这些进程 ID 属于阻止具有指定进程 ID 的服务器进程获取锁的会话,或者如果不存在这样的服务器进程或它未被阻止,则返回一个空数组。 如果服务器进程持有与被阻止进程的锁请求冲突的锁(硬阻止),或者正在等待一个与被阻止进程的锁请求冲突的锁并且在等待队列中排在它前面(软阻止),则一个服务器进程会阻止另一个服务器进程。在使用并行查询时,即使实际锁是由子工作进程持有或等待,结果始终会列出客户端可见的进程 ID(即, 频繁调用此函数可能会对数据库性能产生一定影响,因为它需要在短时间内独占访问锁管理器的共享状态。 |
返回服务器配置文件上次加载的时间。如果当前会话当时处于活动状态,这将是会话本身重新读取配置文件的时间(因此不同会话中的读取时间会略有不同)。否则,这是后主进程重新读取配置文件的时间。 |
返回日志收集器当前正在使用的日志文件的路径名。路径包括 log_directory 目录和各个日志文件名。如果日志收集器已禁用,则结果为 |
返回当前会话临时架构的 OID,如果没有(因为它没有创建任何临时表),则返回零。 |
如果给定的 OID 是另一个会话的临时架构的 OID,则返回 true。(例如,这可用于从目录显示中排除其他会话的临时表。) |
返回当前会话正在监听的异步通知通道的名称集合。 |
返回异步通知队列的最大大小中当前被等待处理的通知所占的比例 (0-1)。有关详细信息,请参见 LISTEN 和 NOTIFY。 |
返回服务器启动的时间。 |
返回阻止具有指定进程 ID 的服务器进程获取安全快照的会话的进程 ID 数组,如果没有这样的服务器进程或它未被阻止,则返回一个空数组。 运行 频繁调用此函数可能会对数据库性能产生一定影响,因为它需要在短时间内访问谓词锁管理器的共享状态。 |
返回 PostgreSQL 触发器的当前嵌套级别(如果未直接或间接从触发器内部调用,则为 0)。 |
返回会话用户的名称。 |
返回用户在被分配数据库角色之前在认证周期中提供的认证方法和身份(如果有)。它表示为 |
这等同于 |
返回描述 PostgreSQL 服务器版本的字符串。您还可以从 server_version 获取此信息,或者对于机器可读版本,请使用 server_version_num。软件开发人员应该使用 |
注意
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.26.2. 访问权限查询函数#
表 9.68列出了允许以编程方式查询对象访问权限的函数。(有关权限的详细信息,请参见第 5.7 节。)在这些函数中,可以按名称或 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.68. 访问权限查询函数
函数 说明 |
---|
用户是否具有表的任何列的权限?如果为整个表持有权限,或者至少为一列授予了列级权限,则此操作将成功。允许的权限类型为 |
用户是否对指定表列具有权限?如果对整个表持有权限,或者对该列授予了列级权限,则此操作会成功。可以通过名称或属性编号( |
用户是否对数据库具有权限?允许的权限类型为 |
用户是否对外部数据包装器具有权限?唯一允许的权限类型为 |
用户是否对函数具有权限?唯一允许的权限类型为 通过名称而不是 OID 指定函数时,允许的输入与 SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); |
用户是否具有语言权限?唯一允许的权限类型是 |
用户是否具有配置参数权限?参数名称不区分大小写。允许的权限类型是 |
用户是否具有架构权限?允许的权限类型是 |
用户是否具有序列权限?允许的权限类型是 |
用户是否具有外部服务器权限?唯一允许的权限类型是 |
用户是否具有表权限?允许的权限类型是 |
用户是否具有表空间权限?唯一允许的权限类型是 |
用户是否具有数据类型权限?唯一允许的权限类型是 |
用户是否具有角色权限?允许的权限类型是 |
在当前用户和当前环境的上下文中,指定表是否启用了行级安全性? |
表 9.69显示了aclitem
类型的可用运算符,该类型是访问权限的目录表示形式。有关如何读取访问权限值的信息,请参见第 5.7 节。
表 9.69.aclitem
运算符
表 9.70显示了一些用于管理aclitem
类型的其他函数。
表 9.70.aclitem
函数
函数 说明 |
---|
构造一个 |
以一组行的形式返回 |
使用给定的属性构造一个 |
9.26.3. 模式可见性查询函数#
表 9.71显示了确定某个对象是否在当前架构搜索路径中可见的函数。例如,如果表所在架构在搜索路径中且在搜索路径中没有出现同名表,则该表可见。这等同于该表可以通过名称引用,而无需显式架构限定。因此,要列出所有可见表的名称
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
对于函数和运算符,如果在路径中没有同名且具有相同参数数据类型的对象,则搜索路径中的对象可见。对于运算符类和族,名称和关联的索引访问方法都被考虑在内。
表 9.71。架构可见性查询函数
所有这些函数都需要对象 OID 来标识要检查的对象。如果您想按名称测试对象,则使用 OID 别名类型(regclass
、regtype
、regprocedure
、regoperator
、regconfig
或regdictionary
)会很方便,例如
SELECT pg_type_is_visible('myschema.widget'::regtype);
请注意,以这种方式测试非模式限定类型名称没有多大意义 — 如果名称可以识别,则它必须是可见的。
9.26.4. 系统目录信息函数#
表 9.72列出了从系统目录中提取信息的函数。
表 9.72. 系统目录信息函数
函数 说明 |
---|
返回由其类型 OID 和可能的类型修饰符标识的数据类型的 SQL 名称。如果不知道特定修饰符,请为类型修饰符传递 NULL。 |
将提供的编码名称转换为表示某些系统目录表中使用的内部标识符的整数。如果提供了未知的编码名称,则返回 |
将用作某些系统目录表中编码的内部标识符的整数转换为人类可读的字符串。如果提供了无效的编码编号,则返回一个空字符串。 |
返回一组记录,描述 PostgreSQL 系统目录中存在的外部键关系。 |
重建约束的创建命令。(这是一个反编译的重建,而不是命令的原始文本。) |
反编译存储在系统目录中的表达式的内部形式,例如列的默认值。如果表达式可能包含 Vars,请将它们引用的关系的 OID 指定为第二个参数;如果预计没有 Vars,则传递零就足够了。 |
重建函数或过程的创建命令。(这是一个反编译的重建,而不是命令的原始文本。)结果是一个完整的 |
重建函数或过程的参数列表,其形式需要出现在 |
重建识别函数或过程所需的参数列表,其形式需要出现在 |
重建函数的 |
重建索引的创建命令。(这是一个反编译的重建,而不是命令的原始文本。)如果提供了 |
返回一组记录,描述服务器识别的 SQL 关键字。 |
以 |
重建用于创建规则的命令。(这是一个反编译的重建,而不是命令的原始文本。) |
返回与列关联的序列的名称,如果没有序列与该列关联,则返回 NULL。如果该列是标识列,则关联的序列是为该列内部创建的序列。对于使用其中一种序列类型( 典型用法是在读取标识或序列列的序列的当前值,例如 SELECT currval(pg_get_serial_sequence('sometable', 'id')); |
重建扩展统计对象の作成命令。(这是一个反编译重建,而不是命令的原始文本。) |
重建触发器的创建命令。(这是一个反编译重建,而不是命令的原始文本。) |
给定 OID,返回角色的名称。 |
重建视图或物化视图的底层 |
重建视图或物化视图的底层 |
根据视图的文本名称而不是其 OID 重建视图或物化视图的底层 |
测试索引列是否具有命名的属性。常见的索引列属性在 表 9.73 中列出。(请注意,扩展访问方法可以为其索引定义其他属性名称。)如果属性名称未知或不适用于特定对象,或者如果 OID 或列号未标识有效的对象,则返回 |
测试索引是否具有命名的属性。常见的索引属性在 表 9.74 中列出。(请注意,扩展访问方法可以为其索引定义其他属性名称。)如果属性名称未知或不适用于特定对象,或者如果 OID 未标识有效的对象,则返回 |
测试索引访问方法是否具有命名属性。在 表 9.75 中列出了访问方法属性。如果属性名称未知或不适用于特定对象,或者 OID 未标识有效对象,则返回 |
返回 |
返回与给定 GUC 关联的标志数组,如果不存在,则返回 |
返回存储在指定表空间中的对象的数据库的 OID 集合。如果此函数返回任何行,则表空间不为空,并且不能删除。要识别填充表空间的特定对象,您需要连接到 |
返回此表空间所在的的文件系统路径。 |
返回传递给它的值的的数据类型的 OID。这对于故障排除或动态构建 SQL 查询很有帮助。该函数声明为返回 例如 SELECT pg_typeof(33); pg_typeof ----------- integer |
返回传递给它的值的校对名称。必要时,该值将被引用并限定模式。如果没有为参数表达式导出校对,则返回 例如 SELECT collation for (description) FROM pg_description LIMIT 1; pg_collation_for ------------------ "default" |
将文本关系名称转换为其 OID。通过将字符串强制转换为类型 |
将文本校对名称转换为其 OID。通过将字符串强制转换为类型 |
将文本模式名称转换为其 OID。通过将字符串强制转换为类型 |
将文本运算符名称转换为其 OID。将字符串强制转换为类型 |
将文本运算符名称(带参数类型)转换为其 OID。将字符串强制转换为类型 |
将文本函数或过程名称转换为其 OID。将字符串强制转换为类型 |
将文本函数或过程名称(带参数类型)转换为其 OID。将字符串强制转换为类型 |
将文本角色名称转换为其 OID。将字符串强制转换为类型 |
将文本类型名称转换为其 OID。将字符串强制转换为类型 |
大多数用于重建(反编译)数据库对象的函数都具有一个可选的*pretty
标志,如果为true
,则会导致结果“漂亮打印”。漂亮打印会抑制不必要的括号并添加空格以提高可读性。漂亮打印的格式更易于阅读,但默认格式更有可能被未来版本的PostgreSQL以相同的方式解释;因此,请避免将漂亮打印的输出用于转储目的。为pretty
*参数传递false
会产生与省略该参数相同的结果。
表 9.73. 索引列属性
名称 | 说明 |
---|---|
asc | 该列在正向扫描时是否按升序排列? |
desc | 列是否在正向扫描中按降序排序? |
nulls_first | 列是否在正向扫描中将 null 值排在前面? |
nulls_last | 列是否在正向扫描中将 null 值排在后面? |
orderable | 列是否具有任何已定义的排序顺序? |
distance_orderable | 列是否可以通过 “distance” 运算符按顺序扫描,例如 ORDER BY col <-> constant ? |
returnable | 列值是否可以通过仅索引扫描返回? |
search_array | 列是否本机支持 col = ANY(array) 搜索? |
search_nulls | 列是否支持 IS NULL 和 IS NOT NULL 搜索? |
表 9.74。索引属性
名称 | 说明 |
---|---|
clusterable | 索引是否可以在 CLUSTER 命令中使用? |
index_scan | 索引是否支持普通(非位图)扫描? |
bitmap_scan | 索引是否支持位图扫描? |
backward_scan | 扫描方向是否可以在扫描过程中更改(以支持光标上的 FETCH BACKWARD 而无需物化)? |
表 9.75。索引访问方法属性
名称 | 说明 |
---|---|
can_order | 访问方法是否支持 ASC 、DESC 和 CREATE INDEX 中相关的关键字? |
can_unique | 访问方法是否支持唯一索引? |
can_multi_col | 访问方法是否支持具有多列的索引? |
can_exclude | 访问方法是否支持排除约束? |
can_include | 访问方法是否支持 CREATE INDEX 的 INCLUDE 子句? |
表 9.76。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.26.5. 对象信息和寻址函数#
表 9.77列出了与数据库对象标识和寻址相关的函数。
表 9.77. 对象信息和寻址函数
9.26.6. 注释信息函数#
表9.78中显示的函数提取先前使用COMMENT命令存储的注释。如果找不到指定参数的注释,则返回 null 值。
表 9.78. 注释信息函数
9.26.7. 数据有效性检查函数#
在表 9.79中显示的函数有助于检查提议输入数据的有效性。
表 9.79. 数据有效性检查函数
9.26.8. 事务 ID 和快照信息函数#
在表 9.80中显示的函数以可导出形式提供服务器事务信息。这些函数的主要用途是确定在两个快照之间提交了哪些事务。
表 9.80. 事务 ID 和快照信息函数
函数 说明 |
---|
返回当前事务的 ID。如果当前事务尚未拥有一个 ID(因为它尚未执行任何数据库更新),它将分配一个新的 ID;有关详细信息,请参见 第 74.1 节。如果在子事务中执行,这将返回顶级事务 ID;有关详细信息,请参见 第 74.3 节。 |
返回当前事务的 ID,或者如果尚未分配 ID,则返回 |
报告最近事务的提交状态。结果之一是 |
返回当前 快照,这是一个数据结构,显示哪些事务 ID 现在正在进行中。快照中仅包含顶级事务 ID;不显示子事务 ID;有关详细信息,请参见 第 74.3 节。 |
返回快照中包含的正在进行中的事务 ID 集。 |
返回快照的 |
返回快照的 |
给定的事务 ID 可见吗?根据此快照(即,在获取快照之前已完成)。请注意,此函数不会针对子事务 ID (subxid) 提供正确答案;有关详细信息,请参阅第 74.3 节。 |
内部事务 ID 类型xid
为 32 位宽,每 40 亿个事务环绕一次。但是,表 9.80中显示的函数使用 64 位类型xid8
,该类型在安装期间不会环绕,并且可以在需要时通过转换转换为xid
;有关详细信息,请参阅第 74.1 节。数据类型pg_snapshot
存储有关特定时刻事务 ID 可见性的信息。其组件在表 9.81中进行描述。pg_snapshot
的文本表示形式为*
xmin*:*
xmax*:*
xip_list*
。例如10:20:10,14,15
表示xmin=10, xmax=20, xip_list=10, 14, 15
。
表 9.81. 快照组件
名称 | 说明 |
---|---|
xmin | 仍然处于活动状态的最低事务 ID。所有小于 xmin 的事务 ID 均已提交且可见,或已回滚且已失效。 |
xmax | 比最高已完成事务 ID 大 1。大于或等于 xmax 的所有事务 ID 在快照时间尚未完成,因此不可见。 |
xip_list | 快照时间正在进行的事务。事务 ID 为 xmin <= 且不在此列表中的事务已在快照时间完成,因此根据其提交状态可见或已失效。此列表不包括子事务 (subxid) 的事务 ID。 |
PostgreSQL13 之前的版本中没有xid8
类型,因此提供了这些函数的变体,使用bigint
表示 64 位 XID,并使用相应的不同的快照数据类型txid_snapshot
。这些较旧的函数名称中包含txid
。出于向后兼容性的考虑,它们仍然受支持,但可能会在将来的版本中删除。请参阅表 9.82。
表 9.82。已弃用的事务 ID 和快照信息函数
9.26.9. 已提交事务信息函数#
表9.83中显示的函数提供有关过去事务何时提交的信息。仅当track_commit_timestamp配置选项已启用时,它们才提供有用的数据,并且仅对在启用后提交的事务提供数据。提交时间戳信息在 vacuum 期间会定期删除。
表 9.83. 已提交事务信息函数
9.26.10. 控制数据函数#
表9.84中显示的函数打印在initdb
期间初始化的信息,例如目录版本。它们还显示有关预写日志和检查点处理的信息。此信息是群集范围的,不特定于任何一个数据库。这些函数从与pg_controldata应用程序相同的信息源提供大部分相同的信息。
表 9.84. 控制数据函数
函数 说明 |
---|
返回提供的交易 ID 和当前交易计数器之间的交易数。 |
返回提供的多事务 ID 和当前多事务计数器之间的多事务 ID 数。 |
返回有关当前检查点状态的信息,如 表 9.85 所示。 |
返回有关当前控制文件状态的信息,如 表 9.86 所示。 |
返回有关群集初始化状态的信息,如 表 9.87 所示。 |
返回有关恢复状态的信息,如 表 9.88 中所示。 |
表 9.85。pg_control_checkpoint
输出列
列名称 | 数据类型 |
---|---|
checkpoint_lsn | pg_lsn |
redo_lsn | pg_lsn |
redo_wal_file | 文本 |
timeline_id | 整数 |
prev_timeline_id | 整数 |
full_page_writes | 布尔值 |
next_xid | 文本 |
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 |
表 9.86。pg_control_system
输出列
列名称 | 数据类型 |
---|---|
pg_control_version | 整数 |
catalog_version_no | 整数 |
system_identifier | bigint |
pg_control_last_modified | 带时区的 timestamp |
表 9.87。pg_control_init
输出列
列名称 | 数据类型 |
---|---|
max_data_alignment | 整数 |
database_block_size | 整数 |
blocks_per_segment | 整数 |
wal_block_size | 整数 |
bytes_per_wal_segment | 整数 |
max_identifier_length | 整数 |
max_index_columns | 整数 |
max_toast_chunk_size | 整数 |
large_object_chunk_size | 整数 |
float8_pass_by_value | 布尔值 |
data_page_checksum_version | 整数 |
表 9.88。pg_control_recovery
输出列
列名称 | 数据类型 |
---|---|
min_recovery_end_lsn | pg_lsn |
min_recovery_end_timeline | 整数 |
backup_start_lsn | pg_lsn |
backup_end_lsn | pg_lsn |
end_of_backup_record_required | 布尔值 |