PostgreSQL 13.1 中文入门教程 PostgreSQL 系统信息函数和运算符

2024-02-25 开发教程 PostgreSQL 13.1 中文入门教程 匿名 2

表 9.63展示了多个可以抽取会话和系统信息的函数。

除了本节列出的函数,还有一些与统计系统相关的函数也提供系统信息。详见第 27.2.2 节。

表 9.63. 会话信息函数

函数

描述

current_catalogname

current_database() → name

返回当前数据库的名称。(在SQL标准中数据库被称为“catalogs”,因此current_catalog是该标准的拼写方式。)

current_query() → text

返回当前所执行查询的文本,由客户端提交的(可能包含一个以上的语句)。

current_rolename

这个等同于 current_user

current_schemaname

current_schema() → name

返回在搜索路径中的第一个模式的名称(如果搜索路径为空则返回空值)。 这个模式将用于没有指定目标模式就创建的任何表或其他已命名对象。

current_schemas( include_implicitboolean) → name[]

返回当前在有效搜索路径中的所有模式的名称的数组,以优先级顺序。 (当前 search_path设置中与已存在的、可搜索模式不相符的项将被省略。) 如果布尔参数为true,则类似pg_catalog的隐式搜索的系统模式将包含在结果中。

current_username

返回当前执行上下文的用户名。

inet_client_addr() → inet

返回当前客户端的IP地址,如果当前连接是通过Unix-域套接字则返回NULL

inet_client_port() → integer

返回当前客户端的IP端口号,如果当前连接是通过Unix-域套接字则返回NULL

inet_server_addr() → inet

返回服务器接受当前连接的IP地址,如果当前连接是通过Unix-域套接字则返回NULL

inet_server_port() → integer

返回服务器接受当前连接的IP端口号,如果当前连接是通过Unix-域套接字则返回NULL

pg_backend_pid() → integer

返回附加到当前会话的服务器进程的进程ID。

pg_blocking_pids( integer) → integer[]

返回阻止服务器进程的会话的进程ID数组,该进程ID与指定的进程ID一起获取锁定,如果没有这样的服务器进程或者没有被阻塞,则返回一个空数组。

如果一个服务器进程持有一个与被阻塞进程的锁请求冲突的锁(硬阻塞),或者正在等待一个与被阻塞进程的锁请求冲突并且在等待队列中位于其前面的锁(软阻塞),那么这个服务器进程就会阻塞另一个服务器进程。 当使用并行查询时结果总是列出客户端可见的进程ID(即pg_backend_pid的结果),即使实际的锁是由子工作进程持有或等待的。 因此,结果中可能存在重复的pid。还要注意当准备好的事务持有冲突锁时,它将用零进程ID表示。

频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要在短时间内独占访问锁管理器的共享状态。

pg_conf_load_time() → timestamp with time zone

返回服务器配置文件最后加载的时间。如果当前会话当时是活跃的,那么这将是会话本身重新读取配置文件的时间(因此在不同的会话中读取会稍有不同)。 否则,就是postmaster进程重新读取配置文件的时间。

pg_current_logfile( [ text] ) → text

返回日志采集器当前使用的日志文件的路径名。该路径包括log_directory目录和单个日志文件名。 如果日志采集器被禁用,结果为NULL。当存在多个日志文件时,每个文件的格式都不同,不带参数的pg_current_logfile将返回在有序列表中找到的第一种格式的文件路径: stderrcsvlog。 如果没有日志文件具有任何这些格式,则返回NULL。 要请求关于特定日志文件格式的信息,可以提供 csvlogstderr作为可选参数的值。 如果在log_destination中没有配置需要的日志格式,则结果为 NULL。 结果反映了current_logfiles文件的内容。

pg_my_temp_schema() → oid

返回当前会话的临时模式的OID,如果没有则返回0(因为它没有创建任何临时表)。

pg_is_other_temp_schema( oid) → boolean

如果给定的OID是另一个会话的临时模式的OID则返回真。(这可能是有用的,例如,在目录显示中排除其他会话的临时表。)

pg_jit_available() → boolean

如果JIT编译器扩展可用(参见第 31 章),并且jit配置参数设置为on,则返回真。

pg_listening_channels() → setof text

返回当前会话正在侦听的异步通知通道的名称集。

pg_notification_queue_usage() → double precision

返回当前被等待处理的通知所占用的异步通知队列最大尺寸的分数(0–1)。更多信息请参见LISTEN 和 NOTIFY。

pg_postmaster_start_time() → timestamp with time zone

返回服务器启动时的时间。

pg_safe_snapshot_blocking_pids( integer) → integer[]

返回一个进程ID数组,该进程ID是阻塞服务器进程获取安全快照的会话的进程ID数组,如果没有这样的服务器进程或者没有阻塞,则返回一个空数组。

运行SERIALIZABLE事务的会话会阻止SERIALIZABLE READ ONLY DEFERRABLE事务获取快照,直到后者确定可以安全地避免获取谓词锁。 关于可序列化和可延迟事务的更多信息,请参见第 13.2.3 节。

频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要在短时间内访问谓词锁管理器的共享状态。

pg_trigger_depth() → integer

返回当前嵌套层次的PostgreSQL触发器(如果没有调用则为 0,直接或间接,从一个触发器内部开始)。

session_username

返回会话用户名.

username

这个相当于 current_user

version() → text

返回描述PostgreSQL服务器的版本的字符串。 你还可以从 server_version中获得此信息,或者对于机器可读的版本,使用server_version_num。 软件开发人员可以使用server_version_num(从8.2起可用)或PQserverVersion,而不是解析文本版本。

注意

current_catalogcurrent_rolecurrent_schemacurrent_usersession_useruser在 SQL里有特殊的语意状态: 它们被调用时结尾不要跟着园括号。 在 PostgreSQL 中,圆括号可以有选择性地被用于current_schema,但是不能和其他的一起用。

session_user通常是发起当前数据库连接的用户,不过超级用户可以用SET SESSION AUTHORIZATION修改这个设置。 current_user是用于权限检查的用户标识。通常, 它总是等于会话用户,但是可以被SET ROLE改变。 它也会在函数执行的过程中随着属性SECURITY DEFINER的改变而改变。 在 Unix 的说法里,那么会话用户是“真实用户”,而当前用户是 “有效用户”。 current_role以及usercurrent_user的同义词(SQL标准在current_rolecurrent_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. 访问权限查询函数

函数

描述

has_any_column_privilege( [ usernameor oid, ] tabletextor oid, privilegetext) → boolean

用户是否对表的任何列有权限? 如果对整个表持有特权,或者对至少一个列有列级的特权授予,则会成功。 允许的权限类型为SELECT, INSERT,UPDATE, 和 REFERENCES

has_column_privilege( [ usernameor oid, ] tabletextor oid, columntextor smallint, privilegetext) → boolean

用户对指定的表列有特权么?如果对整个表持有特权,或者对列授予了列级别的特权,则会成功。 可以通过名称或属性编号(pg_attribute.attnum)指定列。 允许的特权类型为SELECT, INSERT,UPDATE, 和 REFERENCES

has_database_privilege( [ usernameor oid, ] databasetextor oid, privilegetext) → boolean

用户对数据库有特权吗?允许的特权类型为CREATE,CONNECT,TEMPORARY, 和TEMP(相当于 TEMPORARY)。

has_foreign_data_wrapper_privilege( [ usernameor oid, ] fdwtextor oid, privilegetext) → boolean

用户是否拥有外部数据包装的特权?唯一允许的特权类型是USAGE

has_function_privilege( [ usernameor oid, ] functiontextor oid, privilegetext) → boolean

用户对函数有特权吗?唯一允许的特权类型是EXECUTE

当通过名称而不是OID指定函数时,允许的输入与regprocedure数据类型相同(参见第 8.19 节)。一个例子为:

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_language_privilege( [ usernameor oid, ] languagetextor oid, privilegetext) → boolean

用户对语言有特权吗?唯一允许的特权类型是USAGE

has_schema_privilege( [ usernameor oid, ] schematextor oid, privilegetext) → boolean

用户对模式有特权吗?允许的特权类型是CREATEUSAGE

has_sequence_privilege( [ usernameor oid, ] sequencetextor oid, privilegetext) → boolean

用户是否有顺序特权?允许的特权类型有USAGE, SELECT, 和UPDATE

has_server_privilege( [ usernameor oid, ] servertextor oid, privilegetext) → boolean

用户是否对外部服务器有特权?唯一允许的特权类型是USAGE

has_table_privilege( [ usernameor oid, ] tabletextor oid, privilegetext) → boolean

用户对表有特权吗?允许的特权类型有SELECT, INSERT,UPDATE, DELETE,TRUNCATE, REFERENCES,和 TRIGGER

has_tablespace_privilege( [ usernameor oid, ] tablespacetextor oid, privilegetext) → boolean

用户对表空间有特权吗?唯一允许的特权类型是CREATE

has_type_privilege( [ usernameor oid, ] typetextor oid, privilegetext) → boolean

用户对数据类型有特权吗?唯一允许的特权类型是 USAGE。 当通过名称而不是OID指定类型时,允许的输入与regtype数据类型相同(参见第 8.19 节)。

pg_has_role( [ usernameor oid, ] roletextor oid, privilegetext) → boolean

用户对角色有特权么?允许的特权类型是MEMBERUSAGEMEMBER表示角色中的直接或间接成员关系(即执行SET ROLE的权利),而USAGE表示不执行SET ROLE情况下是否立即可用角色的特权。 此函数不允许特殊情况下将user设置为public,因为PUBLIC伪角色永远不能成为真实角色的成员。

row_security_active( tabletextor oid) → boolean

在当前用户和当前环境的上下文之中,指定表的行级安全是活动的吗?

表 9.65 显示了aclitem类型的可用操作符,它是访问权限的目录表示。 有关如何读取访问权限值的信息,请参阅 第 5.7 节。

表 9.65. aclitem操作符

操作符

描述

例子

aclitem=aclitemboolean

aclitem相等吗?(注意,aclitem类型缺少比较操作符的通常集合;它只有相等。 反而言之,aclitem数组只能进行相等比较。)

'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitemf

aclitem[]@>aclitemboolean

数组是否包含指定的特权?(如果有一个数组条目与aclitem的被授权人和授予人相匹配,并且至少具有特权的指定集,则此选项为真。)

'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*/hobbes'::aclitemt

aclitem[]~aclitemboolean

这是@>的已弃用别名。

'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitemt

表 9.66 显示了一些额外的函数来管理aclitem类型。

表 9.66. aclitem函数

函数

描述

acldefault( type"char", ownerIdoid) → aclitem[]

构造一个aclitem数组,该数组持有type类型对象的默认访问特权,该对象属于OID为ownerId的角色。 这表示当对象的ACL条目为空时所假定的访问特权。(默认的访问特权在第 5.7 节中描述。) type

参数必须是下列中的一个 'c' 对应 COLUMN, 'r' 对应 TABLE和类表对象, 's' 对应 SEQUENCE, 'd' 对应 DATABASE, 'f' 对应 FUNCTIONPROCEDURE, 'l' 对应 LANGUAGE, 'L' 对应 LARGE OBJECT, 'n' 对应 SCHEMA, 't' 对应 TABLESPACE, 'F' 对应 FOREIGN DATA WRAPPER, 'S' 对应 FOREIGN SERVER,或 'T' 对应 TYPEDOMAIN.

aclexplode( aclitem[]) → setof record( grantoroid, granteeoid, privilege_typetext, is_grantableboolean)

以行集的形式返回aclitem数组。如果受让人是伪角色PUBLIC,则在grantee列中用0表示。 每个被授予的特权都表示为SELECT, INSERT等。 注意,每个特权被分割成单独的一行,因此在privilege_type列中只出现一个关键字。

makeaclitem( granteeoid, grantoroid, privilegestext, is_grantableboolean) → aclitem

使用给定的属性构造 aclitem

表 9.67展示了决定是否一个特定对象在当前模式搜索路径中可见的函数。 例如,如果一个表所在的模式在当前搜索路径中并且在它之前没有出现过相同的名字,这个表就被说是可见的。 这等价于在语句中表可以被用名称引用但不加显式的模式限定。因此,要列出所有可见表的名字:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

对于函数和操作符,如果路径前面没有相同名称and argument data type(s)的对象,那么搜索路径中的对象就是可见的。 对于操作符类和操作符族,要考虑名称和关联的索引访问方法。

表 9.67. 模式可见性查询函数

函数

描述

pg_collation_is_visible( collationoid) → boolean

排序规则在搜索路径中可见吗?

pg_conversion_is_visible( conversionoid) → boolean

转换在搜索路径中可见吗?

pg_function_is_visible( functionoid) → boolean

函数在搜索路径中可见吗?(这也适用于过程和聚合。)

pg_opclass_is_visible( opclassoid) → boolean

操作符类在搜索路径中可见吗?

pg_operator_is_visible( operatoroid) → boolean

操作符在搜索路径中可见吗?

pg_opfamily_is_visible( opclassoid) → boolean

操作符族在搜索路径中可见吗?

pg_statistics_obj_is_visible( statoid) → boolean

统计对象在搜索路径中可见吗?

pg_table_is_visible( tableoid) → boolean

表在搜索路径中可见吗?(这适用于所有类型的关系,包括视图、物化视图、索引、序列和外部表。)

pg_ts_config_is_visible( configoid) → boolean

文本搜索配置在搜索路径可见吗?

pg_ts_dict_is_visible( dictoid) → boolean

文本搜索字典在搜索路径可见吗?

pg_ts_parser_is_visible( parseroid) → boolean

文本搜索解析器在搜索路径中可见吗?

pg_ts_template_is_visible( templateoid) → boolean

文本搜索模板在搜索路径可见吗?

pg_type_is_visible( typeoid) → boolean

类型(或域)在搜索路径中可见吗?

所有这些函数都要求用对象 OID 来标识将被检查的对象。如果你想用名称来测试一个对象,使用 OID 别名类型(regclassregtyperegprocedureregoperatorregconfigregdictionary)将会很方便。例如:

SELECT pg_type_is_visible('myschema.widget'::regtype);

注意以这种方式测试一个非模式限定的类型名没什么意义 — 如果该名称完全能被识别,它必须是可见的。

表 9.68 列出从系统目录中提取信息的函数。

表 9.68. 系统目录信息函数

函数

描述

format_type( typeoid, typemodinteger) → text

返回由其类型OID和可能的类型修饰符标识的数据类型的SQL名称。如果没有已知的类型修饰符,则传递NULL值给类型修饰符。

pg_get_constraintdef( constraintoid[, prettyboolean] ) → text

重构为了约束的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)

pg_get_expr( exprpg_node_tree, relationoid[, prettyboolean] ) → text

反编译存储在系统目录中的表达式的内部形式,例如列的默认值。 如果表达式可能包含变量,则指定它们所指向的关系的OID作为第二个参数;如果没有预期的变量,传递0就可以了。

pg_get_functiondef( funcoid) → text

重构为了函数或过程的创建命令。(这是一个反编译的重构,而不是命令的原始文本。) 结果是一个完整的CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE语句。

pg_get_function_arguments( funcoid) → text

重新构造函数或过程的参数列表,以其在 CREATE FUNCTION里面需要出现的形式(包括默认值)。

pg_get_function_identity_arguments( funcoid) → text

重新构造标识函数或过程所需的参数列表,以其应出现在ALTER FUNCTION等命令中的形式。这个表单省略默认值。

pg_get_function_result( funcoid) → text

重构函数的RETURNS子句,以其需要出现在CREATE FUNCTION中的形式。对于过程,返回NULL

pg_get_indexdef( indexoid[, columninteger, prettyboolean] ) → text

重构针对索引的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)如果提供了column而且不为零,则只重构该列的定义。

pg_get_keywords() → setof record( wordtext, catcode"char", catdesc

text)

返回一组描述服务器识别的SQL关键字的记录。word列包含关键字。 catcode列包含一个类别代码:U表示无保留关键字,C表示可以是列名的关键字,T表示可以是类型或函数名的关键字,或者 R表示完全保留关键字。 catdesc列包含描述类别的可能本地化字符串。

pg_get_ruledef( ruleoid[, prettyboolean] ) → text

重构针对规则的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)

pg_get_serial_sequence( tabletext, columntext) → text

返回与列相关联的序列名称,如果没有序列与该列相关联则返回NULL。 如果列是标识列,则关联序列是在内部为该列创建的序列。 对于使用一种串行类型(serial, smallserial, bigserial)创建的列,它是为该串行列定义创建的序列。 在后一种情况下,可以使用ALTER SEQUENCE OWNED BY修改或删除关联。 (这个函数可能应该被称为pg_get_owned_sequence;它的当前名称反映了它在历史上曾与串行类型的列一起使用。) 第一个参数是具有可选模式的表名,第二个参数是列名。 由于第一个参数可能包含模式名和表名,因此按照通常的SQL规则解析它,这意味着默认情况下它是小写的。 第二个参数只是一个列名,按照字面来处理,因此保留了它的大小写。结果经过了适当的格式化,可以传递给序列函数(参见第 9.17 节)。

典型的用法是读取序列的当前值以获取标识或串行列,示例如下:

SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_statisticsobjdef( statobjoid) → text

重构针对扩展统计对象的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)

pg_get_triggerdef( triggeroid[, prettyboolean] ) → text

重构针对触发器的创建命令。(这是一个反编译的重构,而不是命令的原始文本。)

pg_get_userbyid( roleoid) → name

根据OID返回角色名。

pg_get_viewdef( viewoid[, prettyboolean] ) → text

重构针对视图或物化视图的SELECT命令。(这是一个反编译的重构,而不是命令的原始文本。)

pg_get_viewdef( viewoid, wrap_columninteger) → text

重构针对视图或物化视图的底层SELECT命令。(这是一个反编译的重构,而不是命令的原始文本。) 在这种形式的函数中,总是启用美观打印,并对长行进行换行,以尽量使它们小于指定的列数。

pg_get_viewdef( viewtext[, prettyboolean] ) → text

根据视图的文本名称而不是它的OID,重构针对视图或物化视图的底层SELECT命令。(这是弃用;请使用OID变体。)

pg_index_column_has_property( indexregclass, columninteger, propertytext) → boolean

测试一个索引列是否具有命名属性。表 9.69列出了常用索引列属性。 (注意,扩展访问方法可以为其索引定义额外的属性名。) 如果属性名未知或不适用于特定对象,或者OID或列号不能识别有效的对象,则返回NULL

pg_index_has_property( indexregclass, propertytext) → boolean

测试一个索引是否具有命名属性。表 9.70列出了常用的索引属性。 (注意,扩展访问方法可以为其索引定义额外的属性名。) 如果属性名未知或不适用于特定对象,或者OID不能识别有效的对象,则返回NULL

pg_indexam_has_property( amoid, propertytext) → boolean

测试索引访问方法是否具有命名属性。访问方法属性如表 9.71所示。 如果属性名未知或不适用于特定对象,或者OID不能识别有效的对象,则返回NULL

pg_options_to_table( options_arraytext[]) → setof record( option_nametext, option_value

text)

返回源自pg_class.reloptionspg_attribute.attoptions的值表示的存储选项集。

pg_tablespace_databases( tablespaceoid) → setof oid

返回具有存储在指定表空间中的对象的数据库的OIDs集。 如果这个函数返回了任何行,那么表空间就不是空的,且不能被删除。 要识别填充表空间的特定对象,需要连接到由pg_tablespace_databases标识的数据库,并查询它们的pg_class目录。

pg_tablespace_location( tablespaceoid) → text

返回表空间所在的文件系统路径。

pg_typeof( "any") → regtype

返回传递值给它的数据类型的OID。这对于故障排除或动态构造SQL查询很有帮助。 函数声明为返回regtype,它是一个OID别名类型(see 第 8.19 节); 这意味着,为了比较,它与OID相同,但显示为类型名。

例如:

SELECT pg_typeof(33);
pg_typeof
-----------
integer
SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
typlen
--------
4

COLLATION FOR( "any") → text

返回传递值给它的排序规则的名称。如果需要,该值会被引号括起来,并使用模式限定。 如果没有为参数表达式派生排序规则,则返回NULL。如果参数不是可排序数据类型,则会引发错误。

例如:

SELECT collation for (description) FROM pg_description LIMIT 1;
pg_collation_for
------------------
"default"
SELECT collation for ('foo' COLLATE "de_DE");
pg_collation_for
------------------
"de_DE"

to_regclass( text) → regclass

将文本关系名转换为它的OID。通过将字符串类型转换为regclass可以得到类似的结果(参见第 8.19 节); 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regcollation( text) → regcollation

将文本排序规则名称转换为它的OID。通过将字符串类型转换为regcollation(参见第 8.19 节)可以得到类似的结果; 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regnamespace( text) → regnamespace

将文本模式名转换为它的OID。通过将字符串转换为regnamespace类型(参见第 8.19 节)可以得到类似的结果; 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regoper( text) → regoper

将文本操作符名称转换为它的OID。通过将字符串类型转换为regoper(参见第 8.19 节)可以得到类似的结果; 但是,如果找不到名称或名称有多义性,该函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regoperator( text) → regoperator

将文本操作符名称(带有参数类型)转换为其OID。通过将字符串转换为regoperator类型(参见第 8.19 节节)可以得到类似的结果; 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regproc( text) → regproc

将文本函数或过程名转换为其OID。通过将字符串转换为regproc类型(参见第 8.19 节)可以得到类似的结果; 但是,如果找不到名称或名称有多义性,该函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regprocedure( text) → regprocedure

将文本函数或过程名(带有参数类型)转换为其OID。通过将字符串类型转换为regprocedure可以得到类似的结果(参见第 8.19 节); 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regrole( text) → regrole

将文本角色名转换为它的OID。通过将字符串类型转换为regrole可以得到类似的结果(参见第 8.19 节); 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字OID作为输入。

to_regtype( text) → regtype

将文本类型名转换为它的OID。通过将字符串类型转换为regtype可以得到类似的结果(参见第 8.19 节); 但是,如果没有找到名称,这个函数将返回NULL而不会抛出错误。与强制转换不同的是,它不接受数字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 NULLIS NOT NULL搜索?

表 9.70. 索引性质

名称描述

clusterable

索引是否可以用于CLUSTER命令?

index_scan

索引是否支持普通扫描(非位图)?

bitmap_scan

索引是否支持位图扫描?

backward_scan

在扫描中扫描方向能否被更改(为了支持游标上无需物化的FETCH BACKWARD)?

表 9.71. 索引访问方法性质

名称描述

can_order

访问方法是否支持ASCDESC以及CREATE INDEX中的有关关键词?

can_unique

访问方法是否支持唯一索引?

can_multi_col

访问方法是否支持多列索引?

can_exclude

访问方法是否支持排除约束?

can_include

访问方法是否支持CREATE INDEXINCLUDE子句?

表 9.72列出了与数据库对象 标识和定位有关的函数。

表 9.72. 对象信息和定位函数

函数

描述

pg_describe_object( classidoid, objidoid, objsubidinteger) → text

返回由目录OID、对象OID和子对象ID(例如表中的列号)标识的数据库对象的文本描述;当引用整个对象时,子对象ID为0)。 这个描述是人类可读的,并且可以根据服务器配置进行翻译。这对于决定pg_depend目录中引用的对象的标识特别有用。

pg_identify_object( classidoid, objidoid, objsubidinteger) → record( typetext, schematext, nametext, identitytext)

返回包含足够信息的行以唯一标识由目录OID、对象OID和子对象ID指定的数据库对象。 这些信息是为了机器可读的,永远不会被翻译。 type标识数据库对象的类型; schema是对象所属的模式名,NULL表示不属于模式的对象类型; name是对象的名称,如果有必要,用引号括起来,如果名称(随着模式名称,如果相关)足以唯一地标识对象,否则为 NULL; identity是完整的对象标识,其精确格式依赖于对象类型,格式中的每个名称都是模式限定的,并在必要时用引号括起来。

pg_identify_object_as_address( classidoid, objidoid, objsubidinteger) → record( typetext, object_namestext[], object_argstext[])

返回包含足够信息的行以唯一标识由目录OID、对象OID和子对象ID指定的数据库对象。 返回的信息独立于当前服务器,也就是说,它可以用于标识另一个服务器中具有相同名称的对象。 type标识数据库对象的类型;object_namesobject_args是文本数组,它们一起构成对对象的引用。 这三个值可以传递给pg_get_object_address以获得对象的内部地址。

pg_get_object_address( typetext, object_namestext[], object_argstext[]) → record( classidoid, objidoid, objsubidinteger)

返回包含足够信息的行以唯一标识由类型代码、对象名称和参数数组指定的数据库对象。 返回的值将在系统目录中使用,例如pg_depend; 它们可以传递给其他系统函数,比如 pg_describe_objectpg_identify_objectclassid是包含该对象的系统目录的OID; objid

是对象本身的OID, objsubid是子对象的ID,如果没有则为零。 这个函数是pg_identify_object_as_address的反向函数。

表 9.73中展示的函数抽取注释,注释是由COMMENT命令在以前存储的。如果对指定参数找不到注释,则返回空值。

表 9.73. 注释信息函数

函数

描述

col_description( tableoid, columninteger) → text

返回表列的注释,该注释由该表的OID和列号指定。(obj_description不能用于表的列,因为列没有自己的oid。)

obj_description( objectoid, catalogname) → text

返回OID指定的数据库对象的注释和包含该对象的系统目录的名称。 例如,obj_description(123456, 'pg_class')将检索OID为123456的表的注释。

obj_description( objectoid) → text

返回仅由其OID指定的数据库对象的注释。 这个已被弃用(deprecated)因为无法保证oid在不同的系统目录中是唯一的;因此,可能会返回错误的注释。

shobj_description( objectoid, catalogname) → text

返回共享数据库对象的注释,该对象由其OID和包含的系统编目的名称指定。 这与obj_description类似,只是它用于检索共享对象(也就是数据库、角色和表空间)上的注释。 有些系统编目对每个集群中的所有数据库都是全局的,其中对象的描述也全局存储。

表 9.74中展示的函数以一种可导出的形式提供了服务器事务信息。 这些函数的主要用途是判断在两个快照之间哪些事务被提交。

表 9.74. 事务ID和快照信息功能

函数

描述

pg_current_xact_id() → xid8

返回当前事务的ID。如果当前事务还没有一个ID(因为它还没有执行任何数据库更新),它将分配一个新的事务。

pg_current_xact_id_if_assigned() → xid8

返回当前事务的ID,如果还没有分配ID则返回NULL。 (如果事务可能是只读的,最好使用这种变体,以避免不必要地消耗XID。)

pg_xact_status( xid8) → text

报告最近的事务的提交状态。如果事务为最近的,系统会保留事务的提交状态,则结果是 in progresscommittedaborted。 如果该事务的时间足够久,并且系统中没有对该事务的引用,而且提交状态信息已经被丢弃,则结果为NULL。 应用可以使用此函数,例如,确定在进行 COMMIT时,应用程序和数据库服务器断开连接后,它们的事务是已提交还是中止。 注意,准备好的事务报告为in progress的事务;如果应用需要确定一个事务ID是否属于一个准备好的事务,则必须检查pg_prepared_xacts

pg_current_snapshot() → pg_snapshot

返回当前snapshot,显示哪些事务IDs正在进行中的数据结构。

pg_snapshot_xip( pg_snapshot) → setof xid8

返回快照中包含的正在进行的事务IDs集。

pg_snapshot_xmax( pg_snapshot) → xid8

返回快照的xmax

pg_snapshot_xmin( pg_snapshot) → xid8

返回快照的xmin

pg_visible_in_snapshot( xid8, pg_snapshot) → boolean

根据此快照,给定的事务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 <= X< xmax且不在快照时已经完成的列表中,因此根据其提交状态,该事务ID要么是可见的,要么是死的。此列表不包括子事务的事务IDs。

在PostgreSQL13以前的版本中,没有xid8类型,因此提供了这些函数的变体,使用bigint表示64位XID,并相应地提供不同的快照数据类型txid_snapshot。 这些旧的函数在它们的名字中有txid。 它们仍然支持向后兼容性,但可能会从未来的版本中删除。参见 表 9.76。

表 9.76. 已弃用的事务ID和快照信息功能

函数

描述

txid_current() → bigint

参见 pg_current_xact_id().

txid_current_if_assigned() → bigint

参见 pg_current_xact_id_if_assigned().

txid_current_snapshot() → txid_snapshot

参见 pg_current_snapshot().

txid_snapshot_xip( txid_snapshot) → setof bigint

参见 pg_snapshot_xip().

txid_snapshot_xmax( txid_snapshot) → bigint

参见 pg_snapshot_xmax().

txid_snapshot_xmin( txid_snapshot) → bigint

参见 pg_snapshot_xmin().

txid_visible_in_snapshot( bigint, txid_snapshot) → boolean

参见 pg_visible_in_snapshot().

txid_status( bigint) → text

参见 pg_xact_status().

表 9.77中的函数提供了关于过去的事务何时被提交的信息。 它们只在启用track_commit_timestamp配置选项时提供有用的数据,并且只针对在启用该选项后提交的事务。

表 9.77. 已提交事务信息函数

函数

描述

pg_xact_commit_timestamp( xid) → timestamp with time zone

返回事务的提交时间戳。

pg_last_committed_xact() → record( xidxid, timestamptimestamp with time zone)

返回最近提交的事务的事务ID和提交时间戳。

表 9.78中所展示的函数能打印initdb期间初始化的信息,例如目录版本。 它们也能显示有关预写式日志和检查点处理的信息。这些信息是集簇范围内的,不与任何特定的一个数据库相关。 这些函数提供大致相同的信息,对于同一种来源,就像 pg_controldata 应用。

表 9.78. 控制数据函数

函数

描述

pg_control_checkpoint() → record

返回有关当前检查点状态的信息, 如 表 9.79所展示。

pg_control_system() → record

返回有关当前控制文件状态的信息,如 表 9.80 所展示。

pg_control_init() → record

返回有关集群初始化状态的信息,如 表 9.81所展示。

pg_control_recovery() → record

返回有关恢复状态的信息,如 表 9.82所展示。

表 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