9.25. 系统信息函数和运算符

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

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

表 9.63. 会话信息函数

名称返回类型描述
current_catalogname当前数据库名(SQL 标准中称作目录
current_database()name当前数据库名
current_query()text当前正在执行的查询的文本,和客户端提交的一样(可能包含多于一个语句)
current_rolename等效于current_user
current_schema[()]name当前模式名
current_schemas(boolean)name[]搜索路径中的模式名,可以选择是否包含隐式模式
current_username当前执行上下文的用户名
inet_client_addr()inet远程连接的地址
inet_client_port()int远程连接的端口
inet_server_addr()inet本地连接的地址
inet_server_port()int本地连接的端口
pg_backend_pid()int 与当前会话关联的服务器进程的进程 ID
pg_blocking_pids(int)int[]阻塞指定服务器进程ID获得锁的进程 ID
pg_conf_load_time()timestamp with time zone配置载入时间
pg_current_logfile([text])text当前日志收集器在使用的主日志文件名或者所要求格式的日志的文件名
pg_my_temp_schema()oid会话的临时模式的 OID,如果没有则为 0
pg_is_other_temp_schema(oid)boolean模式是另一个会话的临时模式吗?
pg_jit_available()boolean这个会话中JIT编译是否可用(见第 31 章)?如果jit被设置为假,则返回false
pg_listening_channels()setof text会话当前正在监听的频道名称
pg_notification_queue_usage()double异步通知队列当前被占用的分数(0-1)
pg_postmaster_start_time()timestamp with time zone服务器启动时间
pg_safe_snapshot_blocking_pids(int)int[]阻止指定服务器进程ID获取安全快照的进程ID
pg_trigger_depth()intPostgreSQL触发器的当前嵌套层次(如果没有调用则为 0,直接或间接,从一个触发器内部开始)
session_username会话用户名
username等价于current_user
version()textPostgreSQL版本信息。机器可读的版本还可见server_version_num

注意

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

session_user通常是发起当前数据库连接的用户,不过超级用户可以用SET SESSION AUTHORIZATION修改这个设置。current_user是用于权限检查的用户标识。通常, 它总是等于会话用户,但是可以被SET ROLE改变。它也会在函数执行的过程中随着属性SECURITY DEFINER的改变而改变。在 Unix 的说法里,那么会话用户是真实用户,而当前用户是有效用户current_role以及usercurrent_user的同义词(SQL标准在current_rolecurrent_user之间做了区分,但PostgreSQL不区分,因为它把用户和角色统一成了一种实体)。

current_schema返回在搜索路径中的第一个模式名(如果搜索路径是空则返回空值)。 如果创建表或者其它命名对象时没有声明目标模式,那么它将是被用于这些对象的模式。current_schemas(boolean)返回一个在搜索路径中出现的所有模式名的数组。布尔选项决定pg_catalog这样的隐式包含的系统模式是否包含在返回的搜索路径中。

注意

搜索路径可以在运行时修改。命令是:

SET search_path TO schema [, schema, ...]

inet_client_addr返回当前客户端的 IP 地址,inet_client_port返回它的端口号。 inet_server_addr返回接受当前连接的服务器的 IP 地址,而inet_server_port返回对应的端口号。如果连接是通过 Unix 域套接字进行的,那么所有这些函数都返回 NULL。

pg_blocking_pids返回一个进程 ID 的数组,数组中的进程中的会话阻塞了指定进程 ID 所代表的服务器进程,如果指定的服务器进程不存在或者没有被阻塞则返回空数组。如果一个进程持有与另一个进程加锁请求冲突的锁(硬锁),或者前者正在等待一个与后者加锁请求冲突的锁并且前者在该锁的等待队列中位于后者的前面(软锁),则前者会阻塞后者。在使用并行查询时,这个函数的结果总是会列出客户端可见的进程 ID(即pg_backend_pid的结果),即便实际的锁是由工作者进程所持有或者等待也是如此。这样造成的后果是,结果中可能会有很多重复的 PID。还要注意当一个预备事务持有一个冲突锁时,这个函数的结果中它将被表示为一个为零的进程 ID。对这个函数的频繁调用可能对数据库性能有一些影响,因为它需要短时间地独占访问锁管理器的共享状态。

pg_conf_load_time返回服务器配置文件最近被载入的timestamp with time zone(如果当前会话在那时就已经存在,这个值将是该会话自己重新读取配置文件的时间,因此在不同的会话中这个读数会有一点变化。如果不是这样,这个值就是 postmaster 进程重读配置文件的时间)。

pg_current_logfiletext类型返回当前被日志收集器使用的日志文件的路径。该路径包括log_directory目录和日志文件名。日志收集必须被启用,否则返回值为NULL。当多个日志文件存在并且每一个都有不同的格式时,不带参数调用pg_current_logfile会返回这样的文件的路径:在所有的文件中,没有任何文件的格式在列表stderrcsvlog中排在这个文件的格式前面。如果没有任何日志文件有上述格式,则返回NULL。要请求一种特定的文件格式,可以以textcsvlog或者stderr作为可选参数的值。当所请求的日志格式不是已配置的log_destination时,会返回NULLpg_current_logfile反映了current_logfiles文件的内容。

pg_my_temp_schema返回当前会话临时模式的 OID,如果没有使用临时模式(因为它没有创建任何临时表)则返回零。如果给定的 OID 是另一个会话的临时模式的 OID,则pg_is_other_temp_schema返回真(这是有用的,例如,要将其他会话的临时表从一个目录显示中排除)。

pg_listening_channels返回当前会话正在监听的异步通知频道的名称的集合。pg_notification_queue_usage返回等待处理的通知占可用的通知空间的比例,它是一个 0-1 范围内的double值。详见LISTENNOTIFY

pg_postmaster_start_time返回服务器启动的timestamp with time zone

pg_safe_snapshot_blocking_pids一个进程ID的数组,它们代表阻止指定进程ID对应的服务器进程获取安全快照的会话,如果没有这类服务器进程或者它没有被阻塞,则会返回一个空数组。一个运行着SERIALIZABLE事务的会话会阻止SERIALIZABLE READ ONLY DEFERRABLE事务获取快照,直到后者确定避免拿到任何谓词锁是安全的。更多有关可序列化以及可延迟事务的信息请参考第 13.2.3 节。频繁调用这个函数可能会对数据库性能产生一些影响,因为它需要短时间访问谓词锁管理器的共享状态。

version返回一个描述PostgreSQL服务器版本的字符串。你也可以从server_version或者一个机器可读的版本server_version_num得到这个信息。软件开发者应该使用server_version_num(从 8.2 开始可用)或者 PQserverVersion ,而不必解析文本形式的版本。

表 9.64列出那些允许用户编程查询对象访问权限的函数。参阅第 5.7 节获取更多有关权限的信息。

表 9.64. 访问权限查询函数

名称返回类型描述
has_any_column_privilege(user, table, privilege) boolean用户有没有表中任意列上的权限
has_any_column_privilege(table, privilege) boolean当前用户有没有表中任意列上的权限
has_column_privilege(user, table, column, privilege) boolean用户有没有列的权限
has_column_privilege(table, column, privilege) boolean当前用户有没有列的权限
has_database_privilege(user, database, privilege) boolean用户有没有数据库的权限
has_database_privilege(database, privilege) boolean当前用户有没有数据库的权限
has_foreign_data_wrapper_privilege(user, fdw, privilege) boolean用户有没有外部数据包装器上的权限
has_foreign_data_wrapper_privilege(fdw, privilege) boolean当前用户有没有外部数据包装器上的权限
has_function_privilege(user, function, privilege) boolean用户有没有函数上的权限
has_function_privilege(function, privilege) boolean当前用户有没有函数上的权限
has_language_privilege(user, language, privilege) boolean用户有没有语言上的权限
has_language_privilege(language, privilege) boolean当前用户有没有语言上的权限
has_schema_privilege(user, schema, privilege) boolean用户有没有模式上的权限
has_schema_privilege(schema, privilege) boolean当前用户有没有模式上的权限
has_sequence_privilege(user, sequence, privilege) boolean用户有没有序列上的权限
has_sequence_privilege(sequence, privilege) boolean当前用户有没有序列上的权限
has_server_privilege(user, server, privilege) boolean用户有没有外部服务器上的权限
has_server_privilege(server, privilege) boolean当前用户有没有外部服务器上的权限
has_table_privilege(user, table, privilege) boolean用户有没有表上的权限
has_table_privilege(table, privilege) boolean当前用户有没有表上的权限
has_tablespace_privilege(user, tablespace, privilege) boolean用户有没有表空间上的权限
has_tablespace_privilege(tablespace, privilege) boolean当前用户有没有表空间上的权限
has_type_privilege(user, type, privilege) boolean用户有没有类型的特权
has_type_privilege(type, privilege) boolean当前用户有没有类型的特权
pg_has_role(user, role, privilege) boolean用户有没有角色上的权限
pg_has_role(role, privilege) boolean当前用户有没有角色上的权限
row_security_active(table) boolean当前用户是否在表上开启了行级安全性

has_table_privilege判断一个用户是否可以用某种特定的方式访问一个表。 该用户可以通过名字或者 OID (pg_authid.oid) 来指定,也可以用public表示 PUBLIC 伪角色。如果省略该参数,则使用current_user。 该表可以通过名字或者 OID 指定(因此,实际上有六种 has_table_privilege的变体,我们可以通过它们的参数数目和类型来区分它们) 。如果用名字指定,那么在必要时该名字可以是模式限定的。 所希望的权限类型是用一个文本串来指定的,它必须是下面的几个值之一: SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERWITH GRANT OPTION可以被选择增加到一个权限类型来测试是否该权限是使用转授选项得到。另外,可以使用逗号分隔来列出多个权限类型,在这种情况下只要具有其中之一的权限则结果为(权限字符串的大小写并不重要,可以在权限名称之间出现额外的空白,但是在权限名内部不能有空白)。一些例子:

SELECT has_table_privilege('myschema.mytable', 'select');
SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

has_sequence_privilege检查一个用户是否能以某种特定方式访问一个序列。它的参数可能性和has_table_privilege相似。所希望测试的访问权限类型必须是下列之一:USAGESELECTUPDATE

has_any_column_privilege检查一个用户是否能以特定方式访问一个表的任意列。其参数可能性和has_table_privilege类似,除了所希望的访问权限类型必须是下面值的某种组合:SELECTINSERTUPDATEREFERENCES。注意在表层面上具有这些权限的任意一个都会隐式地把它授权给表中的每一列,因此如果has_table_privilege对同样的参数返回真则has_any_column_privilege将总是返回。但是如果在至少一列上有一个该权限的列级授权,has_any_column_privilege也会成功。

has_column_privilege检查一个用户是否能以特定方式访问一个列。它的参数可能性与has_table_privilege类似,并且列还可以使用名字或者属性号来指定。希望的访问权限类型必须是下列值的某种组合:SELECTINSERTUPDATEREFERENCES。注意在表级别上具有这些权限中的任意一种将会隐式地把它授予给表上的每一列。

has_database_privilege检查一个用户是否能以特定方式访问一个数据库。它的参数可能性类似 has_table_privilege。希望的访问权限类型必须是以下值的某种组合:CREATECONNECTTEMPORARYTEMP(等价于TEMPORARY)。

has_function_privilege检查一个用户是否能以特定方式访问一个函数。其参数可能性类似has_table_privilege。在用一个文本串而不是 OID 指定一个函数时,允许的输入和regprocedure数据类型一样(参阅 第 8.19 节)。希望的访问权限类型必须是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。希望的访问权限类型必须是CREATEUSAGE

has_server_privilege检查一个用户是否可以以某种特定的方式访问一个外部服务器。 其参数可能性类似 has_table_privilege。希望的访问权限类型必须是USAGE

has_tablespace_privilege检查一个用户是否可以以某种特定的方式访问一个表空间。其参数可能性类似 has_table_privilege。希望的访问权限类型必须是CREATE

has_type_privilege检查一个用户是否能以特定的方式访问一种类型。其参数的可能性类同于has_table_privilege。在用字符串而不是 OID 指定类型时,允许的输入和regtype数据类型相同(见第 8.19 节)。期望的访问特权类型必须等于USAGE

pg_has_role检查一个用户是否可以以某种特定的方式访问一个角色。其参数可能性类似 has_table_privilege,除了public不能被允许作为一个用户名。希望的访问权限类型必须是下列值的某种组合:MEMBERUSAGEMEMBER表示该角色中的直接或间接成员关系(即使用SET ROLE的权力),而USAGE表示不做SET ROLE的情况下该角色的权限是否立即可用。

row_security_active检查在 current_user的上下文和环境中是否为指定的 表激活了行级安全性。表可以用名称或者 OID 指定。

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

表 9.65. aclitem Operators

操作符描述例子结果
= equal'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitemf
@> 包含元素'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*w/hobbes'::aclitemt
~ 包含元素'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*w/hobbes'::aclitemt

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

表 9.66. aclitem Functions

名称返回类型描述
acldefault(type, ownerId)aclitem[]获取属于ownerId的对象的默认访问权限。
aclexplode(aclitem[])setof record获取 aclitem 数组为元组
makeaclitem(grantee, grantor, privilege, grantable)aclitem从输入中建立一个aclitem

acldefault返回属于角色ownerIdtype类型的对象的内置默认访问权限。 这些代表了当对象的ACL条目为空时将被假定的访问权限。 (默认的访问权限在第 5.7 节中描述了)。 type 参数是一个 CHAR: 'c' for COLUMN, 'r' for TABLE 和类表对象, 's' for SEQUENCE, 'd' for DATABASE, 'f' for FUNCTION 或者 PROCEDURE, 'l' for LANGUAGE, 'L' for LARGE OBJECT, 'n' for SCHEMA, 't' for TABLESPACE, 'F' for FOREIGN DATA WRAPPER, 'S' for FOREIGN SERVER, 'T' for TYPE 或者 DOMAIN.

aclexplode返回一个aclitem数组作为行集。输出的列是grantor oid, grantee oid (0 for PUBLIC), 被授权为 text (SELECT, ...) 以及权限是否可以被授予booleanmakeaclitem执行反向操作。

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

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

名称返回类型描述
pg_collation_is_visible(collation_oid) boolean排序规则在搜索路径中可见吗?
pg_conversion_is_visible(conversion_oid) boolean转换在搜索路径中可见吗?
pg_function_is_visible(function_oid) boolean函数在搜索路径中可见吗?
pg_opclass_is_visible(opclass_oid) boolean操作符类在搜索路径中可见吗?
pg_operator_is_visible(operator_oid) boolean操作符在搜索路径中可见吗?
pg_opfamily_is_visible(opclass_oid) boolean操作符族在搜索路径中可见吗?
pg_statistics_obj_is_visible(stat_oid) boolean是搜索路径中的统计信息对象
pg_table_is_visible(table_oid) boolean表在搜索路径中可见吗?
pg_ts_config_is_visible(config_oid) boolean文本搜索配置在搜索路径中可见吗?
pg_ts_dict_is_visible(dict_oid) boolean文本搜索字典在搜索路径中可见吗?
pg_ts_parser_is_visible(parser_oid) boolean文本搜索解析器在搜索路径中可见吗?
pg_ts_template_is_visible(template_oid) boolean文本搜索模板在搜索路径中可见吗?
pg_type_is_visible(type_oid) boolean类型(或域)在搜索路径中可见吗?

每一个函数对一种数据库对象执行可见性检查。注意pg_table_is_visible也可被用于视图、物化视图、索引、序列和外部表,pg_function_is_visible也能被用于过程和聚集,pg_type_is_visible也可以被用于域。对于函数和操作符,如果在路径中更早的地方没有出现具有相同名称和参数数据类型的对象,该对象在搜索路径中是可见的。对于操作符类,名称和相关的索引访问方法都要考虑。

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

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

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

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

表 9.68. 系统目录信息函数

名称返回类型描述
format_type(type_oid, typemod)text获得一个数据类型的 SQL 名字
pg_get_constraintdef(constraint_oid)text获得一个约束的定义
pg_get_constraintdef(constraint_oid, pretty_bool)text获得一个约束的定义
pg_get_expr(pg_node_tree, relation_oid)text反编译一个表达式的内部形式,假定其中的任何 Var 指向由第二个参数指示的关系
pg_get_expr(pg_node_tree, relation_oid, pretty_bool)text反编译一个表达式的内部形式,假定其中的任何 Var 指向由第二个参数指示的关系
pg_get_functiondef(func_oid)text获得一个函数或过程的定义
pg_get_function_arguments(func_oid)text获得一个函数或过程定义的参数列表(带有默认值)
pg_get_function_identity_arguments(func_oid)text获得标识一个函数或过程的参数列表(不带默认值)
pg_get_function_result(func_oid)text获得函数的RETURNS子句(对过程返回空)
pg_get_indexdef(index_oid)text获得索引的CREATE INDEX命令
pg_get_indexdef(index_oid, column_no, pretty_bool)text获得索引的CREATE INDEX命令,或者当column_no为非零时只得到一个索引列的定义
pg_get_keywords()setof record获得 SQL 关键字的列表及其分类
pg_get_ruledef(rule_oid)text获得规则的CREATE RULE命令
pg_get_ruledef(rule_oid, pretty_bool)text获得规则的CREATE RULE命令
pg_get_serial_sequence(table_name, column_name)text获得一个序列列或标识列使用的序列的名称
pg_get_statisticsobjdef(statobj_oid)text为扩展的统计信息对象得到CREATE STATISTICS命令
pg_get_triggerdef(trigger_oid)text获得触发器的CREATE [ CONSTRAINT ] TRIGGER命令
pg_get_triggerdef(trigger_oid, pretty_bool)text获得触发器的CREATE [ CONSTRAINT ] TRIGGER命令
pg_get_userbyid(role_oid)name获得给定 OID 指定的角色名
pg_get_viewdef(view_name)text获得视图或物化视图的底层SELECT命令(已废弃
pg_get_viewdef(view_name, pretty_bool)text获得视图或物化视图的底层SELECT命令(已废弃
pg_get_viewdef(view_oid)text获得视图或物化视图的底层SELECT命令
pg_get_viewdef(view_oid, pretty_bool)text获得视图或物化视图的底层SELECT命令
pg_get_viewdef(view_oid, wrap_column_int)text获得视图或物化视图的底层SELECT命令;带域的行被包装成指定的列数,并隐含了优质打印
pg_index_column_has_property(index_oid, column_no, prop_name)boolean测试一个索引列是否有指定的性质
pg_index_has_property(index_oid, prop_name)boolean测试一个索引是否有指定的性质
pg_indexam_has_property(am_oid, prop_name)boolean测试一个索引访问方法是否有指定的性质
pg_options_to_table(reloptions)setof record获得存储选项的名称/值对的集合
pg_tablespace_databases(tablespace_oid)setof oid获得在该表空间中有对象的数据库的 OID 的集合
pg_tablespace_location(tablespace_oid)text获得这个表空间所在的文件系统的路径
pg_typeof(any)regtype获得任意值的数据类型
collation for (any)text获得该参数的排序规则
to_regclass(rel_name)regclass得到指定关系的 OID
to_regproc(func_name)regproc得到指定函数的 OID
to_regprocedure(func_name)regprocedure得到指定函数的 OID
to_regoper(operator_name)regoper得到指定操作符的 OID
to_regoperator(operator_name)regoperator得到指定操作符的 OID
to_regtype(type_name)regtype得到指定类型的 OID
to_regnamespace(schema_name)regnamespace得到指定模式的 OID
to_regrole(role_name)regrole得到指定角色的 OID

format_type返回一个数据类型的 SQL 名称,它由它的类型 OID 标识并且可能是一个类型修饰符。如果不知道相关的修饰符,则为类型修饰符传递 NULL。

pg_get_keywords返回一组记录描述服务器识别的 SQL 关键字。word列包含关键字。catcode列包含一个分类码:U为未被预定,C 为列名,T类型或函数名,R为预留。catdesc列包含一个可能本地化的描述分类的字符串。

pg_get_constraintdefpg_get_indexdefpg_get_ruledefpg_get_statisticsobjdefpg_get_triggerdef分别重建一个约束、索引、规则、扩展统计对象或触发器的创建命令(注意这是一个反编译的重构,而不是命令的原始文本)。pg_get_expr反编译一个表达式的内部形式,例如一个列的默认值。在检查系统目录内容时有用。如果表达式可能包含 Var,在第二个参数中指定它们引用的关系的 OID;如果不会出现 Var,第二个参数设置为 0 即可。pg_get_viewdef重构定义一个视图的SELECT查询。这些函数的大部分都有两种变体,一种可以可选地优质打印结果。优质打印的格式可读性更强,但是默认格式更可能被未来版本的PostgreSQL以相同的方式解释。在转出目的中避免使用优质打印输出。为优质打印参数传递将得到和不带该参数的变体相同的结果。

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。如果该列是一个标识列,相关联的序列是为该标识列内部创建的序列。对于使用序列类型之一(serialsmallserialbigserial)创建的列,它是为那个序列列定义创建的序列。在后一种情况中,这种关联可以用ALTER SEQUENCE OWNED BY修改或者移除(该函数可能应该已经被pg_get_owned_sequence调用,它当前的名称反映了它通常被serialbigserial列使用)。第一个输入参数是一个带可选模式的表名,第二个参数是一个列名。因为第一个参数可能是一个模式和表,它不能按照一个双引号包围的标识符来对待,意味着它默认情况下是小写的。而第二个参数只是一个列名,将被当作一个双引号包围的来处理并且会保留其大小写。函数返回的值会被适当地格式化以便传递给序列函数(参见第 9.16 节)。一种典型的用法是为标识列或者序列列读取当前值,例如:

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

pg_get_userbyid抽取给定 OID 的角色的名称。

pg_index_column_has_propertypg_index_has_propertypg_indexam_has_property返回指定的索引列、索引或者索引访问方法是否具有指定性质。如果性质的名称找不到或者不适用于特定的对象,亦或者 OID 或者列号不表示合法的对象,则返回NULL。列的性质可参见表 9.69,索引的性质可参见表 9.70,访问方法的性质可参见表 9.71(注意扩展访问方法可以为其索引定义额外的性质)。

表 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子句?

当传入pg_class.reloptionspg_attribute.attoptions时,pg_options_to_table返回存储选项名称/值对(option_name/option_value)的集合。

pg_tablespace_databases允许一个表空间被检查。它返回一组数据库的 OID,这些数据库都有对象存储在该表空间中。如果这个函数返回任何行,则该表空间为非空并且不能被删除。为了显示该表空间中的指定对象,你将需要连接到pg_tablespace_databases标识的数据库并且查询它们的pg_class目录。

pg_typeof返回传递给它的值的数据类型的 OID。这在检修或者动态构建 SQL 查询时有用。函数被声明为返回regtype,它是一个 OID 别名类型(见第 8.19 节);这表明它和一个用于比较目的的 OID 相同,但是作为一个类型名称显示。例如:

SELECT pg_typeof(33);

 pg_typeof 
-----------
 integer
(1 row)

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

表达式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)

值可能被加上引号并且变成模式限定的。如果从参数表达式得不到排序规则,则返回一个空值。如果参数不是一个可排序的数据类型,则抛出一个错误。

to_regclassto_regprocto_regprocedure, to_regoperto_regoperatorto_regtypeto_regnamespaceto_regrole函数把关系、函数、操作符、类型、模式和角色的名称(以text给出)分别转换成、regclassregprocregprocedureregoperregoperatorregtyperegnamespaceregrole对象。这些函数与 text 转换的不同在于它们不接受数字 OID,并且在名称无法找到时不会抛出错误而是返回空。对于to_regprocto_regoper,如果给定名称匹配多个对象时返回空。

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

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

名称返回类型描述
pg_describe_object(catalog_id, object_id, object_sub_id)text得到一个数据库对象的描述
pg_identify_object(catalog_id oid, object_id oid, object_sub_id integer)type text, schema text, name text, identity text得到一个数据库对象的标识
pg_identify_object_as_address(catalog_id oid, object_id oid, object_sub_id integer)type text, name text[], args text[]得到一个数据库对象的地址的外部表示
pg_get_object_address(type text, name text[], args text[])class_id oid, object_id oid, object_sub_id int32从一个数据库对象的内部表示得到它的地址

pg_describe_object返回由目录OID、对象OID以及子对象ID(例如表中的一个列号,当子对象引用了一整个对象时其ID为零)指定的数据库对象的文本描述。这种描述是为 了人类可读的,并且可能是被翻译过的,具体取决于服务器配置。这有助于确定一 个存储在pg_depend目录中的对象的标识。

pg_identify_object返回一行,其中包含有足以唯一标识 由目录 OID、对象 OID 和一个(可能为零的)子对象 ID 指定的数据库对象的信息。 该信息是共机器读取的,并且不会被翻译。type标识数据库对象 的类型;schema是该对象所属的模式名,如果对象类型不属于 模式则为NULL;如果名称(加上方案名,如果相关)足以唯一标识对象,则name就是对象的名称(必要时会被加上引号),否则为NULLidentity是完整的对象标识, 它会表现为与对象类型相关的精确格式,并且如有必要,该格式中的每个部分都会 被模式限定。

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

pg_get_object_address返回一行,其中包含有足以唯一 标识由类型、对象名和参数数组指定的数据库对象的信息。返回值可以被用在诸如 pg_depend等系统目录中并且可以被传递给 pg_identify_objectpg_describe_object等其他 系统函数。class_id是包含该对象的系统目录 OID; objid是对象本身的 OID,而 objsubid是子对象 ID,如果没有则为零。这个函数是 pg_identify_object_as_address的逆函数。

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

表 9.73. 注释信息函数

名称返回类型描述
col_description(table_oid, column_number)text为一个表列获得注释
obj_description(object_oid, catalog_name)text为一个数据库对象获得注释
obj_description(object_oid)text为一个数据库对象获得注释(已被废弃
shobj_description(object_oid, catalog_name)text为一个共享数据库对象获得注释

col_description为一个表列返回注释,该表列由所在表的 OID 和它的列号指定(obj_description不能被用在表列,因为表列没有自己的 OID)。

obj_description的双参数形式返回一个由其 OID 和所在系统目录名称指定的数据库对象的注释。例如,obj_description(123456,'pg_class')将会检索出 OID 为123456的表的注释。obj_description的单参数形式只要求对象 OID。它已经被废弃,因为无法保证 OID 在不同系统目录之间是唯一的;这样可能会返回错误的注释。

shobj_description用起来就像obj_description,但是前者是用于检索共享对象上的注释。某些系统目录对于一个集簇中的所有数据库是全局的,并且其中的对象的描述也是全局存储的。

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

表 9.74. 事务 ID 和快照

名称返回类型描述
txid_current()bigint获得当前事务 ID,如果当前事务没有 ID 则分配一个新的 ID
txid_current_if_assigned()biginttxid_current()相同,但是在事务没有分配ID时是返回空值而不是分配一个新的事务ID
txid_current_snapshot()txid_snapshot获得当前快照
txid_snapshot_xip(txid_snapshot)setof bigint获得快照中正在进行的事务 ID
txid_snapshot_xmax(txid_snapshot)bigint获得快照的xmax
txid_snapshot_xmin(txid_snapshot)bigint获得快照的xmin
txid_visible_in_snapshot(bigint, txid_snapshot)boolean事务 ID 在快照中可见吗?(不能用于子事务 ID)
txid_status(bigint)text报告给定事务的状态:committedabortedin progress,如果事务ID太老则为空值

内部事务 ID 类型(xid)是 32 位宽并且每 40 亿个事务就会回卷。但是,这些函数导出一种 64 位格式,它被使用一个世代计数器,这样在一个安装的生命期内不会回卷。这些函数使用的数据类型txid_snapshot存储了在一个特定时刻有关事务 ID 可见性的信息。它的成分在表 9.75中描述。

表 9.75. 快照成分

名称描述
xmin 仍然活动的最早的事务 ID (txid)。所有更早的事务要么已经被提交并且可见,要么已经被回滚并且死亡。
xmax 第一个还未分配的 txid。所有大于等于它的 txid 在快照的时刻还没有开始,并且因此是不可见的。
xip_list 在快照时刻活动的 txid。这个列表只包括那些位于xminxmax之间的活动 txid;可能有活动的超过xmax的 txid。一个满足xmin <= txid < xmax并且不在这个列表中的 txid 在快照时刻已经结束,并且因此根据其提交状态要么可见要么死亡。该列表不包括子事务的 txid。

txid_snapshot的文本表示是xmin:xmax:xip_list。例如10:20:10,14,15表示xmin=10, xmax=20, xip_list=10, 14, 15

txid_status(bigint)报告一个近期事务的提交状态。当一个应用和数据库服务器的连接在COMMIT正在进行时断开,应用可以用它来判断事务是提交了还是中止了。一个事务的状态将被报告为in progresscommitted或者aborted,前提是该事务的发生时间足够近,这样系统才会保留它的提交状态。如果事务太老,则系统中不会留下对该事务的引用并且提交状态信息也已经被抛弃,那么这个函数将会返回NULL。注意,预备事务会被报告为in progress,如果应用需要判断该txid是否是一个预备事务,应用必须检查pg_prepared_xacts

表 9.76中展示的函数提供了有关于 已经提交事务的信息。这些函数主要提供有关事务何时被提交的信息。只有当 track_commit_timestamp配置选项被启用时它们才能 提供有用的数据,并且只对已提交事务提供数据。

表 9.76. 已提交事务信息

名称返回类型描述
pg_xact_commit_timestamp(xid) timestamp with time zone得到一个事务的提交时间戳
pg_last_committed_xact() xid xid, timestamp timestamp with time zone得到最后一个已提交事务的事务 ID 和提交时间戳

表 9.77中所展示的函数能打印initdb期间初始化的信息,例如系统目录版本。它们也能显示有关预写式日志和检查点处理的信息。这些信息是集簇范围内的,不与任何特定的一个数据库相关。对于同一种来源,它们返回和pg_controldata大致相同的信息,不过其形式更适合于SQL函数。

表 9.77. 控制数据函数

名称返回类型描述
pg_control_checkpoint() record 返回有关当前检查点状态的信息。
pg_control_system() record 返回有关当前控制文件状态的信息。
pg_control_init() record 返回有关集簇初始化状态的信息。
pg_control_recovery() record 返回有关恢复状态的信息。

pg_control_checkpoint返回一个表 9.78中所示的记录

表 9.78. pg_control_checkpoint

列名数据类型
checkpoint_locationpg_lsn
redo_lsnpg_lsn
redo_wal_filetext
timeline_idinteger
prev_timeline_idinteger
full_page_writesboolean
next_xidtext
next_oidoid
next_multixact_idxid
next_multi_offsetxid
oldest_xidxid
oldest_xid_dbidoid
oldest_active_xidxid
oldest_multi_xidxid
oldest_multi_dbidoid
oldest_commit_ts_xidxid
newest_commit_ts_xidxid
checkpoint_timetimestamp with time zone

pg_control_system返回一个表 9.79中所示的记录

表 9.79. pg_control_system

列名数据类型
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

pg_control_init返回一个表 9.80中所示的记录

表 9.80. pg_control_init

列名数据类型
max_data_alignmentinteger
database_block_sizeinteger
blocks_per_segmentinteger
wal_block_sizeinteger
bytes_per_wal_segmentinteger
max_identifier_lengthinteger
max_index_columnsinteger
max_toast_chunk_sizeinteger
large_object_chunk_sizeinteger
float4_pass_by_valueboolean
float8_pass_by_valueboolean
data_page_checksum_versioninteger

pg_control_recovery返回一个表 9.81中所示的记录

表 9.81. pg_control_recovery

列名数据类型
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean