本节描述的函数用于获取有关 PostgreSQL 安装的各种信息。
表 9.71 显示了几个用于提取会话和系统信息的函数。
除了本节列出的函数外,还有许多与统计系统相关的函数也提供系统信息。有关更多信息,请参阅 第 27.2.26 节。
表 9.71. 会话信息函数
函数 描述 |
---|
返回当前数据库的名称。(SQL 标准中,数据库称为“目录”(catalogs),因此 |
返回当前正在执行的查询文本,如客户端提交的(可能包含多个语句)。 |
这等同于 |
返回当前搜索路径中的第一个 schema 的名称(如果搜索路径为空,则返回 NULL)。这是在创建对象时不指定目标 schema 时使用的 schema。 |
返回当前有效搜索路径中的所有 schema 名称的数组,按优先级顺序排列。( |
返回当前执行上下文的用户名称。 |
返回当前客户端的 IP 地址,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回当前客户端的 IP 端口号,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回服务器接受当前连接的 IP 地址,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回服务器接受当前连接的 IP 端口号,如果当前连接是通过 Unix 域套接字进行的,则返回 |
返回连接到当前会话的服务器进程的进程 ID。 |
返回阻止具有指定进程 ID 的服务器进程获取锁的会话的进程 ID 数组,如果不存在此类服务器进程或其未被阻止,则返回空数组。 一个服务器进程阻止另一个进程,是因为它持有与被阻止进程的锁请求冲突的锁(硬阻塞),或者它正在等待一个与被阻止进程的锁请求冲突的锁,并且在等待队列中排在被阻止进程前面(软阻塞)。使用并行查询时,结果总是列出客户端可见的进程 ID(即 频繁调用此函数可能会对数据库性能产生一定影响,因为它需要短时间内独占访问锁管理器共享状态。 |
返回服务器配置文件最后加载的时间。如果当前会话在加载时处于活动状态,这将是会话本身重新读取配置文件的时间(因此在不同会话中读取时间会略有不同)。否则,它是 postmaster 进程重新读取配置文件的时间。 |
返回当前由日志收集器使用的日志文件的路径名。路径包含 log_directory 目录和单个日志文件名。如果日志收集器被禁用,则返回 默认情况下,此函数仅限于超级用户和具有 |
返回当前服务器会话中已加载的可加载模块列表。 |
返回当前会话的临时 schema 的 OID,如果没有(因为它没有创建任何临时表)则返回零。 |
如果给定的 OID 是另一个会话的临时 schema 的 OID,则返回 true。(例如,这对于从目录显示中排除其他会话的临时表很有用。) |
如果服务器已编译支持NUMA支持,则返回 true。 |
返回当前会话正在监听的异步通知通道名称的集合。 |
返回服务器启动的时间。 |
返回阻止具有指定进程 ID 的服务器进程获取安全快照的会话的进程 ID 数组,如果不存在此类服务器进程或其未被阻止,则返回空数组。 运行 频繁调用此函数可能会对数据库性能产生一定影响,因为它需要短时间内访问谓词锁管理器共享状态。 |
返回当前 PostgreSQL 触发器的嵌套级别(如果不是直接或间接从触发器内部调用,则为 0)。 |
返回会话用户的名称。 |
返回用户在身份验证周期中提交的身份验证方法和身份(如果有),然后才被分配数据库角色。它表示为 |
这等同于 |
current_catalog
, current_role
, current_schema
, current_user
, session_user
, and user
在SQL中具有特殊的语法地位:它们必须在没有尾随括号的情况下调用。在 PostgreSQL 中,current_schema
可以选择性地使用括号,但其他函数则不行。
通常,session_user
是启动当前数据库连接的用户;但超级用户可以使用 SET SESSION AUTHORIZATION 更改此设置。current_user
是适用于权限检查的用户标识。通常它等于会话用户,但可以使用 SET ROLE 更改。在执行具有 SECURITY DEFINER
属性的函数期间,它也会发生变化。在 Unix 术语中,会话用户是“真实用户”(real user),当前用户是“有效用户”(effective user)。current_role
and user
是 current_user
的同义词。(SQL 标准在 current_role
和 current_user
之间进行了区分,但 PostgreSQL 没有,因为它将用户和角色统一为一种实体。)
表 9.72 列出了允许以编程方式查询对象访问权限的函数。(有关权限的更多信息,请参阅 第 5.8 节。)在这些函数中,要查询权限的用户可以通过名称或 OID(pg_authid
.oid
)指定;如果名称为 public
,则检查 PUBLIC 伪角色的权限。此外,user
参数可以完全省略,在这种情况下假定为 current_user
。要查询的对象也可以通过名称或 OID 指定。按名称指定时,如果相关,则可以包含 schema 名称。感兴趣的访问权限由文本字符串指定,该字符串必须求值为对象类型的适当权限关键字之一(例如 SELECT
)。可选地,可以在权限类型后面添加 WITH GRANT OPTION
来测试是否拥有授予选项。此外,多个权限类型可以以逗号分隔,在这种情况下,如果列出的任何权限被持有,则结果为 true。(权限字符串的大小写不敏感,并且允许在权限名称之间有额外的空格,但在名称内部不允许。)一些示例
SELECT has_table_privilege('myschema.mytable', 'select'); SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
表 9.72. 访问权限查询函数
函数 描述 |
---|
用户是否对表的任何列拥有权限?如果用户对整个表拥有权限,或者至少有一列具有列级别的权限授予,则此函数成功。允许的权限类型为 |
用户是否对指定的表列拥有权限?如果用户对整个表拥有权限,或者该列具有列级别的权限授予,则此函数成功。列可以通过名称或属性编号( |
用户是否对数据库拥有权限?允许的权限类型为 |
用户是否对外部数据包装器拥有权限?唯一允许的权限类型是 |
用户是否对函数拥有权限?唯一允许的权限类型是 通过名称而非 OID 指定函数时,允许的输入与 SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); |
用户是否对语言拥有权限?唯一允许的权限类型是 |
用户是否对大型对象拥有权限?允许的权限类型为 |
用户是否对配置参数拥有权限?参数名称不区分大小写。允许的权限类型为 |
用户是否对 schema 拥有权限?允许的权限类型为 |
用户是否对序列拥有权限?允许的权限类型为 |
用户是否对外部服务器拥有权限?唯一允许的权限类型是 |
用户是否对表拥有权限?允许的权限类型为 |
用户是否对表空间拥有权限?唯一允许的权限类型是 |
用户是否对数据类型拥有权限?唯一允许的权限类型是 |
用户是否对角色拥有权限?允许的权限类型为 |
在当前用户和当前环境的上下文中,指定表的行级安全性是否处于活动状态? |
表 9.73 显示了 aclitem
类型可用的运算符,它是访问权限的目录表示。有关如何读取访问权限值的信息,请参阅 第 5.8 节。
表 9.73. aclitem
运算符
表 9.74 显示了一些用于管理 aclitem
类型的其他函数。
表 9.74. aclitem
函数
函数 描述 |
---|
构造一个 |
将 |
使用给定的属性构造一个 |
表 9.75 显示了确定某个对象在当前 schema 搜索路径中是否“可见”的函数。例如,如果一个表所在的 schema 在搜索路径中,并且没有同名表出现在搜索路径的前面,则该表被认为是可见的。这等同于该表可以不加 schema 限定地按名称引用。因此,要列出所有可见表的名称
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
对于函数和运算符,搜索路径中的一个对象如果名称(以及参数数据类型)在前一个对象出现之前,则被认为是可见的。对于运算符类和运算符族,将同时考虑名称和关联的索引访问方法。
表 9.75. Schema 可见性查询函数
所有这些函数都需要对象的 OID 来识别要检查的对象。如果要通过名称测试对象,使用 OID 别名类型(regclass
, regtype
, regprocedure
, regoperator
, regconfig
, or regdictionary
)会很方便,例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
请注意,通过这种方式测试非 schema 限定的类型名称没有太大意义——如果名称可以识别,它就必须是可见的。
表 9.76 列出了从系统目录中提取信息的函数。
表 9.76. 系统目录信息函数
函数 描述 |
---|
返回由类型 OID 和可能的类型修饰符标识的数据类型的 SQL 名称。如果不知道特定的类型修饰符,则将类型修饰符传递为 NULL。 |
返回由其类型 OID 标识的域的基础类型的 OID。如果参数是而非域类型的 OID,则按原样返回参数。如果参数不是有效的类型 OID,则返回 NULL。如果存在域依赖链,它将递归查找直到找到基础类型。 假设
|
将提供的编码名称转换为整数,该整数表示某些系统目录表中使用的内部标识符。如果提供了未知编码名称,则返回 |
将某些系统目录表中用作编码内部标识符的整数转换为人类可读的字符串。如果提供了无效的编码号,则返回空字符串。 |
返回描述 PostgreSQL 系统目录中存在的外键关系的记录集。 |
重新构造约束的创建命令。(这是反编译的重构,而不是原始命令文本。) |
反编译存储在系统目录中的表达式的内部形式,例如列的默认值。如果表达式可能包含 Vars,请将它们引用的关系 OID 作为第二个参数指定;如果不预期存在 Vars,则传递零就足够了。 |
重新构造函数或过程的创建命令。(这是反编译的重构,而不是原始命令文本。)结果是一个完整的 |
以在 |
以在 |
以在 |
重新构造索引的创建命令。(这是反编译的重构,而不是原始命令文本。)如果提供了 |
返回描述服务器识别的 SQL 关键字的记录集。 |
以 |
重新构造规则的创建命令。(这是反编译的重构,而不是原始命令文本。) |
返回与列关联的序列的名称,如果该列没有关联序列,则返回 NULL。如果该列是标识列,则关联的序列是为该列内部创建的序列。对于使用 serial 类型( 典型用法是在读取标识列或 serial 列的序列的当前值时,例如: SELECT currval(pg_get_serial_sequence('sometable', 'id')); |
重新构造扩展统计对象的创建命令。(这是反编译的重构,而不是原始命令文本。) |
重新构造触发器的创建命令。(这是反编译的重构,而不是原始命令文本。) |
根据角色的 OID 返回其名称。 |
重新构造视图或物化视图的底层 |
重新构造视图或物化视图的底层 |
从视图的文本名称(而不是其 OID)重新构造视图或物化视图的底层 |
测试索引列是否具有指定的属性。表 9.77 中列出了常见的索引列属性。(请注意,扩展访问方法可以为其索引定义其他属性名称。)如果属性名称未知或不适用于特定对象,或者 OID 或列号未标识有效对象,则返回 |
测试索引是否具有指定的属性。表 9.78 中列出了常见的索引属性。(请注意,扩展访问方法可以为其索引定义其他属性名称。)如果属性名称未知或不适用于特定对象,或者 OID 未标识有效对象,则返回 |
测试索引访问方法是否具有指定的属性。访问方法属性列在 表 9.79 中。如果属性名称未知或不适用于特定对象,或者 OID 未标识有效对象,则返回 |
返回 |
返回与给定 GUC 关联的标志数组,如果 GUC 不存在则返回 |
返回将对象存储在指定表空间中的数据库的 OID 集合。如果此函数返回任何行,则表空间不为空,不能被删除。要识别填充表空间的特定对象,您需要连接到 |
返回此表空间所在的文件系统路径。 |
返回传递给它的值的 OID 数据类型。这对于故障排除或动态构建 SQL 查询可能很有帮助。该函数被声明为返回
|
返回传递给它的值的 collation 名称。值将被引用并根据需要添加 schema 限定。如果参数表达式没有推导出 collation,则返回
|
将文本关系名称转换为其 OID。将字符串转换为 |
将文本 collation 名称转换为其 OID。将字符串转换为 |
将文本模式名称转换为其 OID。通过将字符串强制转换为 |
将文本运算符名称转换为其 OID。通过将字符串强制转换为 |
将带参数类型的文本运算符名称转换为其 OID。通过将字符串强制转换为 |
将文本函数或过程名称转换为其 OID。通过将字符串强制转换为 |
将带参数的文本函数或过程名称转换为其 OID。通过将字符串强制转换为 |
将文本角色名称转换为其 OID。通过将字符串强制转换为 |
解析文本字符串,从中提取潜在的类型名称,并将其转换为类型 OID。字符串中的语法错误将导致错误;但如果字符串是一个语法上有效的类型名称,但在目录中未找到,则结果为 |
解析文本字符串,从中提取潜在的类型名称,并转换其类型修饰符(如果存在)。字符串中的语法错误将导致错误;但如果字符串是一个语法上有效的类型名称,但在目录中未找到,则结果为
|
大多数用于重构(反编译)数据库对象的函数都包含一个可选的 pretty
标志,如果该标志为 true
,则结果会被“美化打印”。美化打印会抑制不必要的括号并添加空格以提高可读性。美化打印格式更具可读性,但默认格式在未来版本的 PostgreSQL 中更有可能被以相同方式解释;因此,请避免将美化打印的输出用于转储目的。将 false
传递给 pretty
参数会产生与省略该参数相同的结果。
表 9.77. 索引列属性
名称 | 描述 |
---|---|
asc |
在正向扫描时,列是否按升序排序? |
desc |
在正向扫描时,列是否按降序排序? |
nulls_first |
在正向扫描时,列是否将 NULL 值排在前面? |
nulls_last |
在正向扫描时,列是否将 NULL 值排在后面? |
orderable |
列是否具有任何已定义的排序顺序? |
distance_orderable |
列是否可以通过“距离”运算符(例如 ORDER BY col <-> constant )按顺序扫描? |
returnable |
列值是否可以通过仅索引扫描返回? |
search_array |
列是否原生支持 col = ANY(array) 搜索? |
search_nulls |
列是否支持 IS NULL 和 IS NOT NULL 搜索? |
表 9.78. 索引属性
名称 | 描述 |
---|---|
clusterable |
索引是否可以用于 CLUSTER 命令? |
index_scan |
索引是否支持普通(非位图)扫描? |
bitmap_scan |
索引是否支持位图扫描? |
backward_scan |
扫描方向是否可以在扫描中途改变(以支持光标上的 FETCH BACKWARD 而无需物化)? |
表 9.79. 索引访问方法属性
名称 | 描述 |
---|---|
can_order |
访问方法是否支持 CREATE INDEX 中的 ASC 、DESC 和相关关键字? |
can_unique |
访问方法是否支持唯一索引? |
can_multi_col |
访问方法是否支持多列索引? |
can_exclude |
访问方法是否支持排除约束? |
can_include |
访问方法是否支持 CREATE INDEX 的 INCLUDE 子句? |
表 9.80. GUC 标志
Flag | 描述 |
---|---|
EXPLAIN |
带有此标志的参数包含在 EXPLAIN (SETTINGS) 命令中。 |
NO_SHOW_ALL |
带有此标志的参数不包含在 SHOW ALL 命令中。 |
NO_RESET |
带有此标志的参数不支持 RESET 命令。 |
NO_RESET_ALL |
带有此标志的参数不包含在 RESET ALL 命令中。 |
NOT_IN_SAMPLE |
默认情况下,带有此标志的参数不包含在 postgresql.conf 中。 |
RUNTIME_COMPUTED |
带有此标志的参数是运行时计算的参数。 |
表 9.81 列出了与数据库对象标识和寻址相关的函数。
表 9.81. 对象信息和寻址函数
pg_get_acl
对于检索和检查与数据库对象关联的权限很有用,无需查看特定目录。例如,要检索当前数据库中所有对象的已授予权限
postgres=# SELECT (pg_identify_object(s.classid,s.objid,s.objsubid)).*, pg_catalog.pg_get_acl(s.classid,s.objid,s.objsubid) AS acl FROM pg_catalog.pg_shdepend AS s JOIN pg_catalog.pg_database AS d ON d.datname = current_database() AND d.oid = s.dbid JOIN pg_catalog.pg_authid AS a ON a.oid = s.refobjid AND s.refclassid = 'pg_authid'::regclass WHERE s.deptype = 'a'; -[ RECORD 1 ]----------------------------------------- type | table schema | public name | testtab identity | public.testtab acl | {postgres=arwdDxtm/postgres,foo=r/postgres}
表 9.82. 注释信息函数 中显示的函数用于提取使用 COMMENT 命令之前存储的注释。如果找不到指定参数的注释,则返回 null 值。
表 9.82. 注释信息函数
表 9.83. 数据有效性检查函数 中显示的函数有助于检查建议输入数据的有效性。
表 9.83. 数据有效性检查函数
表 9.84. 事务 ID 和快照信息函数 中显示的函数以可导出格式提供服务器事务信息。这些函数的主要用途是确定在两个快照之间提交了哪些事务。
表 9.84. 事务 ID 和快照信息函数
函数 描述 |
---|
返回提供的事务 ID 与当前事务计数器之间的事务数。 |
返回提供的多事务 ID 与当前多事务计数器之间的多事务 ID 数。 |
返回当前事务的 ID。如果当前事务尚无 ID(因为它尚未执行任何数据库更新),它将分配一个新的 ID;有关详细信息,请参阅 第 67.1 节。如果在子事务中执行,这将返回顶层事务 ID;有关详细信息,请参阅 第 67.3 节。 |
返回当前事务的 ID,如果尚未分配 ID,则返回 |
报告最近一次事务的提交状态。结果是 |
返回当前快照,这是一个显示哪些事务 ID 当前正在进行的的数据结构。快照仅包含顶层事务 ID;不显示子事务 ID;有关详细信息,请参阅 第 67.3 节。 |
返回快照中包含的正在进行的事务 ID 集合。 |
返回快照的 |
返回快照的 |
给定的事务 ID 是否根据此快照可见(即,它是在快照拍摄之前完成的)?请注意,此函数对于子事务 ID(subxid)不会给出正确答案;有关详细信息,请参阅 第 67.3 节。 |
返回指定多事务 ID 的每个成员的事务 ID 和锁定模式。锁定模式 |
内部事务 ID 类型 xid
是 32 位宽,每 40 亿次事务回绕一次。但是,表 9.84. 事务 ID 和快照信息函数 中显示的函数(age
、mxid_age
和 pg_get_multixact_members
除外)使用 64 位类型 xid8
,该类型在安装生命周期内不会回绕,如果需要,可以转换为 xid
类型;有关详细信息,请参阅 第 67.1 节。pg_snapshot
数据类型存储有关特定时间点事务 ID 可见性的信息。其组件在表 9.85. 快照组件 中描述。pg_snapshot
的文本表示为
。例如 xmin
:xmax
:xip_list
10:20:10,14,15
表示 xmin=10, xmax=20, xip_list=10, 14, 15
。
表 9.85. 快照组件
名称 | 描述 |
---|---|
xmin |
最低仍然活跃的事务 ID。所有小于 xmin 的事务 ID 要么已提交并可见,要么已回滚并死掉。 |
xmax |
最高已完成事务 ID 的下一个 ID。在快照拍摄时,所有大于或等于 xmax 的事务 ID 都尚未完成,因此是不可见的。 |
xip_list |
快照拍摄时正在进行的事务。事务 ID xmin <= 且不在此列表中的事务在快照拍摄时已完成,因此根据其提交状态可见或死掉。此列表不包含子事务(subxids)的事务 ID。 |
在 13 版之前的 PostgreSQL 版本中,没有 xid8
类型,因此提供了使用 bigint
来表示 64 位 XID 的函数的变体,并且具有相应的不同快照数据类型 txid_snapshot
。这些旧函数名称中包含 txid
。它们仍然为了向后兼容而支持,但可能会在未来版本中被移除。请参阅 表 9.86。
表 9.86. 已弃用的事务 ID 和快照信息函数
表 9.87. 已提交事务信息函数 中显示的函数提供有关过去事务提交时间的信息。只有当 track_commit_timestamp 配置选项启用且仅对启用后提交的事务有用时,它们才提供有用数据。通常会在 vacuum 过程中删除提交时间戳信息。
表 9.87. 已提交事务信息函数
表 9.88. 控制数据函数 中显示的函数会打印在 initdb
期间初始化的信息,例如目录版本。它们还显示有关预写日志和检查点处理的信息。这些信息是集群范围的,不特定于任何单个数据库。这些函数提供与 pg_controldata 应用程序相同的信息,来自同一源。
表 9.88. 控制数据函数
表 9.89. pg_control_checkpoint
输出列
Column Name | Data Type |
---|---|
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.90. pg_control_system
输出列
Column Name | Data Type |
---|---|
pg_control_version |
integer |
catalog_version_no |
integer |
system_identifier |
bigint |
pg_control_last_modified |
timestamp with time zone |
表 9.91. pg_control_init
输出列
Column Name | Data Type |
---|---|
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 |
default_char_signedness |
boolean |
表 9.92. pg_control_recovery
输出列
Column Name | Data Type |
---|---|
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.93. 版本信息函数 中显示的函数会打印版本信息。
表 9.93. 版本信息函数
函数 描述 |
---|
返回描述 PostgreSQL 服务器版本的字符串。您还可以从 server_version 获取此信息,或者为了获得机器可读的版本,请使用 server_version_num。软件开发人员应使用 |
返回表示 PostgreSQL 使用的 Unicode 版本的字符串。 |
如果服务器使用 ICU 构建,则返回表示 ICU 使用的 Unicode 版本的字符串;否则返回 |
表 9.94. WAL 摘要信息函数 中显示的函数会打印有关 WAL 摘要状态的信息。请参阅 summarize_wal。
表 9.94. WAL 摘要信息函数
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。