pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
表 9.51列出了多个用于提取会话和系统信息的函数。
除了本节列出的函数外,还有许多与统计系统相关的函数,这些函数也提供系统信息。有关更多信息,请参见第 27.2.2 节。
表 9.51. 会话信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
name |
当前数据库名称(在 SQL 标准中称为“目录”) |
|
name |
当前数据库名称 |
|
text |
客户端提交的当前执行查询文本(可能包含多条语句) |
|
name |
等价于 current_user |
|
name |
当前模式名称 |
|
name[] |
搜索路径中的模式名称,可选地包含隐式模式 |
|
name |
当前执行上下文的用户名 |
|
inet |
远端连接地址 |
|
int |
远端连接端口 |
|
inet |
本地连接地址 |
|
int |
本地连接端口 |
|
int |
服务当前会话的服务器进程的进程 ID |
|
timestamp with time zone |
配置加载时间 |
|
boolean |
该模式是否为另一个会话的临时模式? |
|
setof text |
会话当前监听的通道名称 |
|
oid |
会话临时模式的 OID;不存在时为 0 |
|
timestamp with time zone |
服务器启动时间 |
|
int |
PostgreSQL 触发器的当前嵌套层级(如果不是从触发器内部直接或间接调用,则为 0) |
|
name |
会话用户名 |
|
name |
等价于 current_user |
|
text |
PostgreSQL版本信息 |
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 不作区分,因为它把用户和角色统一为单一类型的实体。)
current_schema 返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回空值)。在创建表或其他命名对象时,如果未指定目标模式,就会使用该模式。current_schemas(boolean) 返回当前搜索路径中所有模式名称的数组。布尔选项决定是否在返回的搜索路径中包含 pg_catalog 等隐式包含的系统模式。
可以在运行时修改搜索路径,命令如下:
SET search_path TOschema[,schema, ...]
pg_listening_channels返回当前会话正在侦听的信道名称集合。更多信息见LISTEN。
inet_client_addr 返回当前客户端的 IP 地址,inet_client_port 返回端口号。inet_server_addr 返回服务器接受当前连接所用的 IP 地址,inet_server_port 返回端口号。如果当前连接通过 Unix 域套接字建立,这些函数都返回 NULL。
pg_conf_load_time 返回服务器配置文件最近一次加载的时间,类型为 timestamp with time zone。(如果当时当前会话已经存在,则返回该会话自身重新读取配置文件的时间,因此不同会话中的时间会略有不同。否则,返回 postmaster 进程重新读取配置文件的时间。)
pg_my_temp_schema 返回当前会话的临时模式的 OID;如果没有临时模式(因为尚未创建任何临时表),则返回零。如果给定 OID 是另一个会话的临时模式的 OID,pg_is_other_temp_schema 返回真。(这可以用于从系统目录显示结果中排除其他会话的临时表等场景。)
pg_postmaster_start_time 返回服务器启动的时间,类型为 timestamp with time zone。
version返回一个描述PostgreSQL服务器版本的字符串。
has_type_privilege 检查用户是否可以以某种方式访问类型。其参数形式与 has_table_privilege 类似。通过文本字符串而不是 OID 指定类型时,允许的输入与 regtype 数据类型相同(参见第 8.18 节)。所需访问权限类型必须为 USAGE。
表 9.52列出了允许用户以编程方式查询对象访问权限的函数。关于权限的更多信息,请参见第 5.6 节。
表 9.52. 访问权限查询函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
boolean |
用户是否对表的至少一列具有权限 |
|
boolean |
当前用户是否对表的至少一列具有权限 |
|
boolean |
用户是否具有列权限 |
|
boolean |
当前用户是否具有列权限 |
|
boolean |
用户是否具有数据库权限 |
|
boolean |
当前用户是否具有数据库权限 |
|
boolean |
用户是否具有外部数据包装器权限 |
|
boolean |
当前用户是否具有外部数据包装器权限 |
|
boolean |
用户是否具有函数权限 |
|
boolean |
当前用户是否具有函数权限 |
|
boolean |
用户是否具有语言权限 |
|
boolean |
当前用户是否具有语言权限 |
|
boolean |
用户是否具有模式权限 |
|
boolean |
当前用户是否具有模式权限 |
|
boolean |
用户是否具有序列权限 |
|
boolean |
当前用户是否具有序列权限 |
|
boolean |
用户是否具有外部服务器权限 |
|
boolean |
当前用户是否具有外部服务器权限 |
|
boolean |
用户是否具有表权限 |
|
boolean |
当前用户是否具有表权限 |
|
boolean |
用户是否具有表空间权限 |
|
boolean |
当前用户是否具有表空间权限 |
|
boolean |
用户是否具有类型权限 |
|
boolean |
当前用户是否具有类型权限 |
|
boolean |
用户是否具有角色权限 |
|
boolean |
当前用户是否具有角色权限 |
has_table_privilege检查用户是否可以以某种方式访问表。用户参数可以是名称、OID(pg_authid.oid), public(表示 PUBLIC 伪角色);如果省略该参数,则使用current_user。表可以通过名称或 OID 指定。(因此,has_table_privilege实际上有六种变体,可以通过参数的数量和类型来区分。)通过名称指定时,如有需要,可以用模式限定名称。所需访问权限类型由文本字符串指定,其值必须为以下值之一:SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES,或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 类似。所需访问权限类型必须为 USAGE、SELECT 或 UPDATE 之一。
has_any_column_privilege 检查用户是否可以以某种方式访问表的至少一列。其参数形式与 has_table_privilege 类似,但所需访问权限类型必须为 SELECT、INSERT、UPDATE 或 REFERENCES 的某种组合。注意,在表级别拥有这些权限中的任意一种,就隐式地对表的每一列拥有该权限,因此对于相同参数,如果 has_table_privilege 返回 true,has_any_column_privilege 也总是返回真。但是,只要至少有一列获得该权限的列级授权,has_any_column_privilege 也会成功。
has_column_privilege 检查用户是否可以以某种方式访问列。其参数形式与 has_table_privilege 类似,但还可以通过列名或属性编号指定列。所需访问权限类型必须为 SELECT、INSERT、UPDATE 或 REFERENCES 的某种组合。注意,在表级别拥有这些权限中的任意一种,就隐式地对表的每一列拥有该权限。
has_database_privilege 检查用户是否可以以某种方式访问数据库。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 CREATE、CONNECT、TEMPORARY 或 TEMP(等同于 TEMPORARY)的某种组合。
has_function_privilege检查用户是否可以以某种方式访问函数。其参数形式类似于has_table_privilege。通过文本字符串而不是 OID 指定函数时,允许的输入与regprocedure数据类型相同(参见第 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 类似。所需访问权限类型必须为 CREATE 或 USAGE 的某种组合。
has_server_privilege 检查用户是否可以以某种方式访问外部服务器。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 USAGE。
has_tablespace_privilege 检查用户是否可以以某种方式访问表空间。其参数形式与 has_table_privilege 类似。所需访问权限类型必须为 CREATE。
pg_has_role检查用户是否可以以某种方式访问角色。它的参数可能性与has_table_privilege类似,但不允许使用public作为用户名。所需访问权限类型必须为MEMBER或USAGE的某种组合。MEMBER表示直接或间接地属于该角色(即有权执行SET ROLE),而USAGE表示无需执行SET ROLE就能立即使用该角色的权限。
表 9.53列出了判断某个特定对象是否可见的函数,其判断依据是当前模式搜索路径。例如,如果表所在的模式位于搜索路径中,并且在搜索路径的更前面没有同名表,就称该表可见。这等价于说,可以只通过表名引用该表,而不必显式地用模式限定。要列出所有可见表的名称:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 9.53. 模式可见性查询函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
boolean |
排序规则是否在搜索路径中可见 |
|
boolean |
转换是否在搜索路径中可见 |
|
boolean |
函数是否在搜索路径中可见 |
|
boolean |
操作符类是否在搜索路径中可见 |
|
boolean |
操作符是否在搜索路径中可见 |
|
boolean |
操作符族是否在搜索路径中可见 |
|
boolean |
表是否在搜索路径中可见 |
|
boolean |
全文检索配置是否在搜索路径中可见 |
|
boolean |
全文检索词典是否在搜索路径中可见 |
|
boolean |
全文检索解析器是否在搜索路径中可见 |
|
boolean |
全文检索模板是否在搜索路径中可见 |
|
boolean |
类型(或域)是否在搜索路径中可见 |
每个函数检查一种数据库对象的可见性。注意,pg_table_is_visible 也可用于视图、物化视图、索引、序列和外部表;pg_type_is_visible 也可用于域。对于函数和操作符,如果搜索路径更前面没有名称和参数数据类型都相同的对象,那么路径中的该对象就是可见的。对于操作符类,会同时考虑名称和关联的索引访问方法。
所有这些函数都需要用对象 OID 标识要检查的对象。如果想按名称测试对象,使用 OID 别名类型会很方便(regclass, regtype, regprocedure, regoperator, regconfig,或regdictionary),例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
注意,用这种方式测试不带模式限定的类型名并没有太大意义:只要该名称能够被识别,它就必然可见。
表 9.54 列出从系统目录中提取信息的函数。
pg_describe_object返回由目录 OID、对象 OID 和子对象 ID(可为零)指定的数据库对象的文本描述。该描述供人阅读,并且可能会根据服务器配置被翻译。这有助于确定存储在pg_depend目录中的对象标识。
表 9.54. 系统目录信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
text |
获取数据类型的 SQL 名称 |
|
text |
获取数据库对象的描述 |
|
text |
获取约束定义 |
|
text |
获取约束定义 |
|
text |
反编译表达式的内部形式,假定其中所有 Var 节点都引用第二个参数指定的关系 |
|
text |
反编译表达式的内部形式,假定其中所有 Var 节点都引用第二个参数指定的关系 |
|
text |
获取函数定义 |
|
text |
获取函数定义的参数列表(包含默认值) |
|
text |
获取用于标识函数的参数列表(不含默认值) |
|
text |
获取函数的 RETURNS 子句 |
|
text |
获取索引的 CREATE INDEX 命令 |
|
text |
获取索引的 CREATE INDEX 命令;当 column_no 非零时,仅获取一个索引列的定义 |
|
setof record |
获取 SQL 关键字及其类别的列表 |
|
text |
获取规则的 CREATE RULE 命令 |
|
text |
获取规则的 CREATE RULE 命令 |
|
text |
获取 serial、smallserial 或 bigserial 列使用的序列名称 |
pg_get_triggerdef(trigger_oid) |
text |
获取触发器的 CREATE [ CONSTRAINT ] TRIGGER 命令 |
pg_get_triggerdef(trigger_oid, pretty_bool) |
text |
获取触发器的 CREATE [ CONSTRAINT ] TRIGGER 命令 |
|
name |
获取具有给定 OID 的角色名称 |
|
text |
获取视图或物化视图的底层 SELECT 命令(已弃用) |
|
text |
获取视图或物化视图的底层 SELECT 命令;如果 pretty_bool 为真,带字段的行会换行到 80 列(已弃用) |
|
text |
获取视图或物化视图的底层 SELECT 命令 |
|
text |
获取视图或物化视图的底层 SELECT 命令;如果 pretty_bool 为真,带字段的行会换行到 80 列 |
|
text |
获取视图或物化视图的底层 SELECT 命令;包含字段的行按指定列数折行,并隐含启用美化输出 |
|
setof record |
获取存储选项的名称/值对集合 |
|
setof oid |
获取在该表空间中具有对象的数据库 OID 集合 |
|
text |
获取该表空间在文件系统中的路径 |
|
regtype |
获取任意值的数据类型 |
|
text |
获取参数的排序规则 |
format_type 返回数据类型的 SQL 名称,该类型由其类型 OID 和可能存在的类型修饰符标识。如果不知道具体的类型修饰符,请为类型修饰符参数传入 NULL。
pg_get_keywords 返回一组记录,描述服务器识别的 SQL 关键字。word 列包含关键字。catcode 列包含类别代码:U 表示非保留关键字,C 表示列名,T 表示类型名或函数名,R 表示保留关键字。catdesc 列包含描述该类别的字符串,该字符串可能已经过本地化。
pg_get_constraintdef、pg_get_indexdef、pg_get_ruledef和pg_get_triggerdef分别重建约束、索引、规则或触发器的创建命令。(注意,这是通过反编译重建的,并非命令的原始文本。)pg_get_expr 反编译单个表达式的内部形式,例如列的默认值。这在检查系统目录内容时可能很有用。如果表达式可能包含 Var 节点,请将它们所引用的关系的 OID 指定为第二个参数;如果预计不含 Var 节点,传入零即可。pg_get_viewdef 重建定义视图的 SELECT 查询。这些函数中的大多数有两种变体,其中一种可以选择“美化输出”结果。美化格式更易读,但默认格式更可能被未来版本的 PostgreSQL 以相同方式解释;转储时应避免使用美化输出。向美化输出参数传入 false,所得结果与完全没有该参数的变体相同。
pg_get_functiondef 返回一个函数的完整 CREATE OR REPLACE FUNCTION 语句。pg_get_function_arguments 以 CREATE FUNCTION 中所需的形式返回函数参数列表。pg_get_function_result 类似地返回该函数相应的 RETURNS 子句。pg_get_function_identity_arguments 返回标识函数所需的参数列表,例如以 ALTER FUNCTION 中所需的形式返回。此形式省略默认值。
pg_get_serial_sequence返回与某一列关联的序列名称;如果该列没有关联的序列,则返回 NULL。第一个输入参数是可以带有模式名的表名,第二个参数是列名。由于第一个参数可能包含模式和表,它不会被当作双引号括起的标识符处理,因此默认转换为小写;第二个参数只包含列名,会被当作带双引号的标识符处理并保留大小写。函数返回的值采用适于传递给序列函数的格式(参见第 9.16 节)。这一关联可以使用ALTER SEQUENCE OWNED BY修改或移除。(该函数也许应该叫作pg_get_owned_sequence;它当前的名称反映了它通常用于serial或bigserial列这一事实。)
pg_get_userbyid 根据给定 OID 获取角色名称。
向 pg_options_to_table 传入 pg_class.reloptions 或 pg_attribute.attoptions 时,它返回存储选项名称/值对(option_name/option_value)的集合。
pg_tablespace_databases 用于检查表空间。它返回在该表空间中存储了对象的数据库 OID 集合。如果此函数返回任何行,则说明该表空间不为空,不能删除。要显示存放在该表空间中的具体对象,需要连接到 pg_tablespace_databases 标识的数据库,并查询它们的 pg_class 系统目录。
表达式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)
返回值可能带有引号和模式限定。如果不能为参数表达式推导出排序规则,则返回空值。如果参数的数据类型不支持排序规则,则会报错。
col_description 返回表列的注释,列由其所属表的 OID 和列号指定。(obj_description 不能用于表列,因为列没有自身的 OID。)
pg_typeof返回所传入值的数据类型的 OID。这有助于排查问题或动态构造 SQL 查询。函数声明的返回类型是regtype,它是一种 OID 别名类型(参见第 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)
表 9.55中的函数用于提取此前通过COMMENT命令存储的注释。如果找不到与指定参数对应的注释,则返回空值。
表 9.55. 注释信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
text |
获取表列的注释 |
|
text |
获取数据库对象的注释 |
|
text |
获取数据库对象的注释(已弃用) |
|
text |
获取共享数据库对象的注释 |
obj_description 的双参数形式返回数据库对象的注释,对象由其 OID 和所在系统目录的名称指定。例如,obj_description(123456,'pg_class') 会获取 OID 为 123456 的表的注释。obj_description 的单参数形式只需要对象 OID。该形式已被弃用,因为无法保证 OID 在不同系统目录之间唯一,因而可能返回错误的注释。
shobj_description 的用法与 obj_description 相同,但用于获取共享对象的注释。有些系统目录由数据库集簇中的所有数据库全局共享,其中对象的描述也全局存储。
表 9.56中的函数以可导出的形式提供服务器事务信息。这些函数主要用于确定两个快照之间有哪些事务提交。
表 9.56. 事务 ID 和快照
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
bigint |
获取当前事务 ID;如果当前事务尚无 ID,则分配一个新的 ID |
|
txid_snapshot |
获取当前快照 |
|
setof bigint |
获取快照中正在进行的事务 ID |
|
bigint |
获取快照的 xmax |
|
bigint |
获取快照的 xmin |
|
boolean |
该事务 ID 是否在快照中可见?(不要用于子事务 ID) |
内部事务 ID 类型(xid)为 32 位,每经过约 40 亿个事务就会回卷一次。不过,这些函数导出的是用“纪元”计数器扩展的 64 位格式,在一次安装的整个使用期间都不会回卷。这些函数使用的 txid_snapshot 数据类型存储某一时刻的事务 ID 可见性信息。其组成部分见表 9.57。
表 9.57. 快照组件
| 名称 | 描述 |
|---|---|
xmin |
仍然活动的最早事务 ID(txid)。所有更早的事务要么已经提交且可见,要么已经回滚而失效。 |
xmax |
第一个尚未分配的 txid。所有大于或等于此值的 txid 在快照时尚未开始,因此不可见。 |
xip_list |
快照时活动的 txid。该列表仅包含 xmin 与 xmax 之间的活动 txid;可能存在大于 xmax 的活动 txid。满足 xmin <= txid < xmax 且不在此列表中的 txid 在快照时已经完成,因此根据其提交状态,要么可见,要么失效。该列表不包含子事务的 txid。 |
txid_snapshot 的文本表示为 。例如,xmin:xmax:xip_list10:20:10,14,15 表示 xmin=10, xmax=20, xip_list=10, 14, 15。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。