PostgreSQL 系统信息函数和运算符
表 9.63展示了多个可以抽取会话和系统信息的函数。
除了本节列出的函数,还有一些与统计系统相关的函数也提供系统信息。详见第 27.2.2 节。
表 9.63. 会话信息函数
函数 描述 |
---|
返回当前数据库的名称。(在SQL标准中数据库被称为“catalogs”,因此 |
返回当前所执行查询的文本,由客户端提交的(可能包含一个以上的语句)。 |
这个等同于 |
返回在搜索路径中的第一个模式的名称(如果搜索路径为空则返回空值)。 这个模式将用于没有指定目标模式就创建的任何表或其他已命名对象。 |
返回当前在有效搜索路径中的所有模式的名称的数组,以优先级顺序。 (当前 search_path设置中与已存在的、可搜索模式不相符的项将被省略。) 如果布尔参数为 |
返回当前执行上下文的用户名。 |
返回当前客户端的IP地址,如果当前连接是通过Unix-域套接字则返回 |
返回当前客户端的IP端口号,如果当前连接是通过Unix-域套接字则返回 |
返回服务器接受当前连接的IP地址,如果当前连接是通过Unix-域套接字则返回 |
返回服务器接受当前连接的IP端口号,如果当前连接是通过Unix-域套接字则返回 |
返回附加到当前会话的服务器进程的进程ID。 |
返回阻止服务器进程的会话的进程ID数组,该进程ID与指定的进程ID一起获取锁定,如果没有这样的服务器进程或者没有被阻塞,则返回一个空数组。 如果一个服务器进程持有一个与被阻塞进程的锁请求冲突的锁(硬阻塞),或者正在等待一个与被阻塞进程的锁请求冲突并且在等待队列中位于其前面的锁(软阻塞),那么这个服务器进程就会阻塞另一个服务器进程。 当使用并行查询时结果总是列出客户端可见的进程ID(即 频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要在短时间内独占访问锁管理器的共享状态。 |
返回服务器配置文件最后加载的时间。如果当前会话当时是活跃的,那么这将是会话本身重新读取配置文件的时间(因此在不同的会话中读取会稍有不同)。 否则,就是postmaster进程重新读取配置文件的时间。 |
返回日志采集器当前使用的日志文件的路径名。该路径包括log_directory目录和单个日志文件名。 如果日志采集器被禁用,结果为 |
返回当前会话的临时模式的OID,如果没有则返回0(因为它没有创建任何临时表)。 |
如果给定的OID是另一个会话的临时模式的OID则返回真。(这可能是有用的,例如,在目录显示中排除其他会话的临时表。) |
返回当前会话正在侦听的异步通知通道的名称集。 |
返回服务器启动时的时间。 |
返回一个进程ID数组,该进程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.64列出那些允许编程查询对象访问权限的函数。参阅第 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.64. 访问权限查询函数
函数 描述 |
---|
用户是否对表的任何列有权限? 如果对整个表持有特权,或者对至少一个列有列级的特权授予,则会成功。 允许的权限类型为 |
用户对指定的表列有特权么?如果对整个表持有特权,或者对列授予了列级别的特权,则会成功。 可以通过名称或属性编号( |
用户对数据库有特权吗?允许的特权类型为 |
用户是否拥有外部数据包装的特权?唯一允许的特权类型是 |
用户对函数有特权吗?唯一允许的特权类型是 当通过名称而不是OID指定函数时,允许的输入与
|
用户对语言有特权吗?唯一允许的特权类型是 |
用户对模式有特权吗?允许的特权类型是 |
用户是否有顺序特权?允许的特权类型有 |
用户是否对外部服务器有特权?唯一允许的特权类型是 |
用户对表有特权吗?允许的特权类型有 |
用户对表空间有特权吗?唯一允许的特权类型是 |
用户对数据类型有特权吗?唯一允许的特权类型是 |
用户对角色有特权么?允许的特权类型是 |
在当前用户和当前环境的上下文之中,指定表的行级安全是活动的吗? |
表 9.65 显示了aclitem
类型的可用操作符,它是访问权限的目录表示。 有关如何读取访问权限值的信息,请参阅 第 5.7 节。
表 9.65. aclitem
操作符
表 9.66 显示了一些额外的函数来管理aclitem
类型。
表 9.66. aclitem
函数
函数 描述 |
---|
构造一个 |
以行集的形式返回 |
使用给定的属性构造 |
表 9.67展示了决定是否一个特定对象在当前模式搜索路径中可见的函数。 例如,如果一个表所在的模式在当前搜索路径中并且在它之前没有出现过相同的名字,这个表就被说是可见的。 这等价于在语句中表可以被用名称引用但不加显式的模式限定。因此,要列出所有可见表的名字:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
对于函数和操作符,如果路径前面没有相同名称and argument data type(s)的对象,那么搜索路径中的对象就是可见的。 对于操作符类和操作符族,要考虑名称和关联的索引访问方法。
表 9.67. 模式可见性查询函数
所有这些函数都要求用对象 OID 来标识将被检查的对象。如果你想用名称来测试一个对象,使用 OID 别名类型(regclass
、regtype
、regprocedure
、regoperator
、regconfig
或regdictionary
)将会很方便。例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
注意以这种方式测试一个非模式限定的类型名没什么意义 — 如果该名称完全能被识别,它必须是可见的。
表 9.68 列出从系统目录中提取信息的函数。
表 9.68. 系统目录信息函数
函数 描述 |
---|
返回由其类型OID和可能的类型修饰符标识的数据类型的SQL名称。如果没有已知的类型修饰符,则传递NULL值给类型修饰符。 |
重构为了约束的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) |
反编译存储在系统目录中的表达式的内部形式,例如列的默认值。 如果表达式可能包含变量,则指定它们所指向的关系的OID作为第二个参数;如果没有预期的变量,传递0就可以了。 |
重构为了函数或过程的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) 结果是一个完整的 |
重新构造函数或过程的参数列表,以其在 |
重新构造标识函数或过程所需的参数列表,以其应出现在 |
重构函数的 |
重构针对索引的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)如果提供了 |
返回一组描述服务器识别的SQL关键字的记录。 |
重构针对规则的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) |
返回与列相关联的序列名称,如果没有序列与该列相关联则返回NULL。 如果列是标识列,则关联序列是在内部为该列创建的序列。 对于使用一种串行类型( 典型的用法是读取序列的当前值以获取标识或串行列,示例如下:
|
重构针对扩展统计对象的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) |
重构针对触发器的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) |
根据OID返回角色名。 |
重构针对视图或物化视图的 |
重构针对视图或物化视图的底层 |
根据视图的文本名称而不是它的OID,重构针对视图或物化视图的底层 |
测试一个索引列是否具有命名属性。表 9.69列出了常用索引列属性。 (注意,扩展访问方法可以为其索引定义额外的属性名。) 如果属性名未知或不适用于特定对象,或者OID或列号不能识别有效的对象,则返回 |
测试一个索引是否具有命名属性。表 9.70列出了常用的索引属性。 (注意,扩展访问方法可以为其索引定义额外的属性名。) 如果属性名未知或不适用于特定对象,或者OID不能识别有效的对象,则返回 |
测试索引访问方法是否具有命名属性。访问方法属性如表 9.71所示。 如果属性名未知或不适用于特定对象,或者OID不能识别有效的对象,则返回 |
返回源自 |
返回具有存储在指定表空间中的对象的数据库的OIDs集。 如果这个函数返回了任何行,那么表空间就不是空的,且不能被删除。 要识别填充表空间的特定对象,需要连接到由 |
返回表空间所在的文件系统路径。 |
返回传递值给它的数据类型的OID。这对于故障排除或动态构造SQL查询很有帮助。 函数声明为返回 例如:
|
返回传递值给它的排序规则的名称。如果需要,该值会被引号括起来,并使用模式限定。 如果没有为参数表达式派生排序规则,则返回 例如:
|
将文本关系名转换为它的OID。通过将字符串类型转换为 |
将文本排序规则名称转换为它的OID。通过将字符串类型转换为 |
将文本模式名转换为它的OID。通过将字符串转换为 |
将文本操作符名称转换为它的OID。通过将字符串类型转换为 |
将文本操作符名称(带有参数类型)转换为其OID。通过将字符串转换为 |
将文本函数或过程名转换为其OID。通过将字符串转换为 |
将文本函数或过程名(带有参数类型)转换为其OID。通过将字符串类型转换为 |
将文本角色名转换为它的OID。通过将字符串类型转换为 |
将文本类型名转换为它的OID。通过将字符串类型转换为 |
大多数重构(反编译)数据库对象的函数都有一个可选的 pretty
标志,如果为true
,结果将被“pretty-printed”。 美观打印会抑制不必要的圆括号,并为易读性增加空格。 美观打印的格式可读性更好,但是默认格式更有可能被PostgreSQL的未来版本以同样的方式解释;
因此,避免为转储目的使用美观打印的输出。为pretty
参数传递false
会产生与省略参数相同的结果。
表 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 NULL 和IS NOT NULL 搜索? |
表 9.70. 索引性质
名称 | 描述 |
---|---|
clusterable
|
索引是否可以用于CLUSTER 命令? |
index_scan
|
索引是否支持普通扫描(非位图)? |
bitmap_scan
|
索引是否支持位图扫描? |
backward_scan
|
在扫描中扫描方向能否被更改(为了支持游标上无需物化的FETCH BACKWARD )? |
表 9.71. 索引访问方法性质
名称 | 描述 |
---|---|
can_order
|
访问方法是否支持ASC 、DESC 以及CREATE INDEX 中的有关关键词? |
can_unique
|
访问方法是否支持唯一索引? |
can_multi_col
|
访问方法是否支持多列索引? |
can_exclude
|
访问方法是否支持排除约束? |
can_include
|
访问方法是否支持CREATE INDEX 的INCLUDE 子句? |
表 9.72列出了与数据库对象 标识和定位有关的函数。
表 9.72. 对象信息和定位函数
表 9.73中展示的函数抽取注释,注释是由COMMENT命令在以前存储的。如果对指定参数找不到注释,则返回空值。
表 9.73. 注释信息函数
表 9.74中展示的函数以一种可导出的形式提供了服务器事务信息。 这些函数的主要用途是判断在两个快照之间哪些事务被提交。
表 9.74. 事务ID和快照信息功能
函数 描述 |
---|
返回当前事务的ID。如果当前事务还没有一个ID(因为它还没有执行任何数据库更新),它将分配一个新的事务。 |
返回当前事务的ID,如果还没有分配ID则返回 |
报告最近的事务的提交状态。如果事务为最近的,系统会保留事务的提交状态,则结果是 |
返回当前snapshot,显示哪些事务IDs正在进行中的数据结构。 |
返回快照中包含的正在进行的事务IDs集。 |
返回快照的 |
返回快照的 |
根据此快照,给定的事务ID是否可见(visible)(也就是说,它是否在快照拍摄之前完成)? 注意,这个函数不会给出子事务ID的正确答案。 |
内部事务ID类型xid
是32位宽的,可捆卷(wraps around)每40亿个事务。 但是,表 9.74中所示的函数使用的是64位类型的xid8
,它在安装过程中不捆卷(wraps
around),如果需要,可以通过强制转换将其转换为xid
。 数据类型pg_snapshot
存储特定时刻事务ID可见性的信息。 其组成如表 9.75所描述。pg_snapshot
的文本表示形式是
。 例如xmin
:xmax
:xip_list
10:20:10,14,15
表示xmin=10, xmax=20, xip_list=10, 14, 15
。
表 9.75. 快照组件
名称 | 描述 |
---|---|
xmin
|
仍然处于活动状态的最低事务ID。所有小于xmin 的事务IDs要么提交且可见,要么回滚并死亡。 |
xmax
|
比最高完成的事务ID还高出一个值。所有大于或等于xmax 的事务IDs到快照时还没有完成,因此不可见。 |
xip_list
|
快照时正在进行的事务。一个事务ID为xmin <= 且不在快照时已经完成的列表中,因此根据其提交状态,该事务ID要么是可见的,要么是死的。此列表不包括子事务的事务IDs。 |
在PostgreSQL13以前的版本中,没有xid8
类型,因此提供了这些函数的变体,使用bigint
表示64位XID,并相应地提供不同的快照数据类型txid_snapshot
。 这些旧的函数在它们的名字中有txid
。 它们仍然支持向后兼容性,但可能会从未来的版本中删除。参见
表 9.76。
表 9.76. 已弃用的事务ID和快照信息功能
表 9.77中的函数提供了关于过去的事务何时被提交的信息。 它们只在启用track_commit_timestamp配置选项时提供有用的数据,并且只针对在启用该选项后提交的事务。
表 9.77. 已提交事务信息函数
表 9.78中所展示的函数能打印initdb
期间初始化的信息,例如目录版本。 它们也能显示有关预写式日志和检查点处理的信息。这些信息是集簇范围内的,不与任何特定的一个数据库相关。 这些函数提供大致相同的信息,对于同一种来源,就像
pg_controldata
应用。
表 9.78. 控制数据函数
表 9.79. 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
|
带时区的时间戳
|
表 9.80. pg_control_system
输出列
列名称 | 数据类型 |
---|---|
pg_control_version
|
integer
|
catalog_version_no
|
integer
|
system_identifier
|
bigint
|
pg_control_last_modified
|
timestamp with time zone
|
表 9.81. 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.82. 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
|