9.25. 系统信息功能

Table 9.60显示了一些提取会话和系统信息的功能。

除了本节中列出的功能外,还有许多与统计系统有关的功能,这些功能还提供系统信息。有关更多信息,请参见Section 28.2.2

表 9.60. 会话信息功能

NameReturn TypeDescription
current_catalogname当前数据库的名称(在 SQL 标准中称为“目录”)
current_database()name当前数据库名称
current_query()textClient 端提交的当前正在执行的查询的文本(可能包含多个语句)
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 编译(请参见Chapter 32)?如果jit设置为 false,则返回false
pg_listening_channels()setof text会话当前正在监听的 Channels 名称
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以获取机器可读版本。

Note

current_catalogcurrent_rolecurrent_schemacurrent_usersession_useruser在 SQL 中具有特殊的语法状态:必须在不带括号的情况下调用它们。 (在 PostgreSQL 中,圆括号可以选择与current_schema一起使用,但不能与其他括号一起使用.)

session_user通常是发起当前数据库连接的用户;但是超级用户可以使用设置会话授权更改此设置。 current_user是适用于权限检查的用户标识符。通常,它等于会话用户,但是可以使用SET ROLE进行更改。在执行具有属性SECURITY DEFINER的功能时,它也会更改。用 Unix 的话来说,会话用户是“真实用户”,当前用户是“有效用户”。 current_roleusercurrent_user的同义词。 (SQL 标准在current_rolecurrent_user之间进行了区分,但 PostgreSQL 没有,因为它将用户和角色统一为一种实体.)

current_schema返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回 null 值)。这是将用于不指定目标架构而创建的任何表或其他命名对象的架构。 current_schemas(boolean)返回搜索路径中当前所有模式名称的数组。布尔选项确定返回的搜索路径中是否包含隐式包含的系统架构(例如pg_catalog)。

Note

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

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

inet_client_addr返回当前 Client 端的 IP 地址,而inet_client_port返回端口号。 inet_server_addr返回服务器接受当前连接的 IP 地址,inet_server_port返回端口号。如果当前连接是通过 Unix 域套接字,则所有这些函数都将返回 NULL。

pg_blocking_pids返回使用指定的进程 ID 阻塞服务器进程的会话的进程 ID 数组,如果没有这样的服务器进程或未被阻塞,则返回一个空数组。如果一个服务器进程持有与被阻止进程的锁定请求(硬块)冲突的锁,或者正在 await 一个与被阻止进程的锁定请求相冲突的锁,并且在 await 队列中位于另一个服务器进程之前,则另一个服务器进程将阻塞另一个服务器进程块)。使用并行查询时,即使子工作进程持有或 await 实际的锁,结果也始终列出 Client 端可见的进程 ID(即pg_backend_pid结果)。结果,结果中可能存在重复的 PID。还要注意,当准备好的事务持有冲突的锁时,在此函数的结果中它将由零进程 ID 表示。频繁调用此函数可能会影响数据库性能,因为它需要在短时间内独占访问锁 Management 器的共享状态。

上次加载服务器配置文件时,pg_conf_load_time返回timestamp with time zone。 (如果当前会话当时还处于活动状态,那么这将是该会话本身重新读取配置文件的时间,因此在不同的会话中读取的内容将有所不同.否则,这是重新提交 postmaster 进程的时间.配置文件.)

pg_current_logfile作为text返回日志收集器当前正在使用的日志文件的路径。该路径包括log_directory目录和日志文件名。必须启用日志收集,否则返回值为NULL。当存在多个日志文件时,每个日志文件都具有不同的格式,不带参数调用的pg_current_logfile将返回在有序列表中找到第一种格式的文件的路径:stderr,csvlog。如果没有任何日志文件具有以下格式,则返回NULL。要请求提供特定的文件格式,例如text,则 csvlog 或 stderr 作为可选参数的值。如果请求的日志格式不是配置的log_destination,则返回值为NULLpg_current_logfile反映current_logfiles文件的内容。

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

pg_listening_channels返回当前会话正在侦听的一组异步通知通道的名称。 pg_notification_queue_usage返回正在 await 处理的通知当前占用的通知总可用空间的一部分,以double表示,范围为 0-1.有关更多信息,请参见LISTENNOTIFY

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

pg_safe_snapshot_blocking_pids返回使用指定的进程 ID 阻止服务器进程获取安全快照的会话的进程 ID 数组,如果没有此类服务器进程或未阻止该进程,则返回一个空数组。运行SERIALIZABLE事务的会话会阻止SERIALIZABLE READ ONLY DEFERRABLE事务获取快照,直到后者确定可以安全地避免使用任何谓词锁定为止。有关可序列化和可延迟 Transaction 的更多信息,请参见Section 13.2.3。频繁调用此函数可能会影响数据库性能,因为它需要在短时间内访问谓词锁 Management 器的共享状态。

version返回描述 PostgreSQL 服务器版本的字符串。您也可以从server_version或机器可读版本server_version_num获取此信息。软件开发人员应使用server_version_num(从 8.2 开始可用)或PQserverVersion而不是解析文本版本。

Table 9.61列出了允许用户以编程方式查询对象访问权限的功能。有关权限的更多信息,请参见Section 5.6

表 9.61. 访问权限查询功能

NameReturn TypeDescription
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用户是否有 Sequences 特权
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的六个变体,可以通过其参数的数量和类型来区分.)按名称指定时,必要时可以使用模式限定的名称。所需的访问特权类型由文本字符串指定,该文本字符串的值必须为SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGER之一。 (可选)可以将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。所需的访问特权类型必须为USAGESELECTUPDATE之一。

has_any_column_privilege检查用户是否可以特定方式访问表的任何列。它的参数可能性类似于has_table_privilege,除了所需的访问特权类型必须评估为SELECTINSERTUPDATEREFERENCES的某种组合。请注意,在表级别具有这些特权中的任何特权都会隐式地为表的每一列授予该特权,因此,如果has_table_privilege对相同的参数执行此操作,则has_any_column_privilege将始终返回true。但是,如果有至少一个列的列级特权授予,则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 指定函数时,允许的 Importing 与regprocedure数据类型相同(请参见Section 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 指定类型时,允许的 Importing 与regtype数据类型相同(请参见Section 8.19)。所需的访问权限类型必须为USAGE

pg_has_role检查用户是否可以特定方式访问角色。它的自变量可能性类似于has_table_privilege,只是不允许public作为用户名。所需的访问特权类型必须评估为MEMBERUSAGE的某种组合。 MEMBER表示角色的直接或间接成员身份(即,执行SET ROLE的权限),而USAGE表示是否无需进行SET ROLE即可立即获得角色的特权。

row_security_activecurrent_user和环境的上下文中检查指定表的行级安全性是否处于活动状态。该表可以通过名称或 OID 指定。

Table 9.62显示确定当前模式搜索路径中某个对象是否“可见”的函数。例如,如果包含表的表位于搜索路径中,并且在搜索路径中较早出现的同名表,则认为该表可见。这等效于以下声明:可以通过名称引用表而无需显式模式限定。列出所有可见表的名称:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

表 9.62. 模式可见性查询功能

NameReturn TypeDescription
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);

请注意,以这种方式测试非模式限定的类型名称没有多大意义-如果可以完全识别该名称,则该名称必须可见。

Table 9.63列出了从系统目录中提取信息的功能。

表 9.63. 系统目录信息功能

NameReturn TypeDescription
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子句(为过程返回 null)
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返回由其类型 OID 以及可能由类型修饰符标识的数据类型的 SQL 名称。如果没有特定的修饰符,则将 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反编译单个表达式的内部形式,例如列的默认值。在检查系统目录的内容时很有用。如果表达式可能包含 Vars,则将它们所引用的关系的 OID 指定为第二个参数;如果没有期望的变量,则零就足够了。 pg_get_viewdef重建定义视图的SELECT查询。这些函数中的大多数都有两个变体,其中之一可以选择“漂亮地打印”结果。漂亮打印的格式更易读,但是默认格式可能会在以后的 PostgreSQL 版本中以相同的方式解释;避免将漂亮打印的输出用于转储。为 pretty-print 参数传递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。如果列是标识列,则关联的序列是为标识列在内部创建的序列。对于使用一种串行类型(serialsmallserialbigserial)创建的列,这是为该串行列定义创建的序列。在后一种情况下,可以使用ALTER SEQUENCE OWNED BY修改或删除此关联。 (该函数可能应该被称为pg_get_owned_sequence;其当前名称反映了它通常与serialbigserial列一起使用的事实.)第一个 Importing 参数是具有可选模式的表名,第二个参数是列名。由于第一个参数可能是模式和表,因此不会将其视为双引号标识符,这意味着默认情况下将其小写,而将第二个参数(仅是列名)视为双引号,并且将其保留大小写。该函数返回一个适当格式的值,以传递给序列函数(请参见Section 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返回指定的索引列,索引或索引访问方法是否具有 named 属性。如果属性名称未知或不适用于特定对象,或者 OID 或列号不能标识有效对象,则返回NULL。请参阅Table 9.64的列属性,Table 9.65的索引属性,和Table 9.66的访问方法属性。 (请注意,扩展访问方法可以为其索引定义其他属性名称.)

表 9.64. 索引栏属性

NameDescription
asc向前扫描时,列是否按升序排序?
desc向前扫描时,列是否按降序排序?
nulls_first在向前扫描时,该列是否首先使用空值排序?
nulls_last在前向扫描中,使用 null 排序的列是否最后持续?
orderable该列是否具有任何已定义的排序 Sequences?
distance_orderable可以通过“距离”运算符(例如ORDER BY col <-> constant)按 Sequences 扫描列吗?
returnable可以通过仅索引扫描返回列值吗?
search_array该列本身是否支持col = ANY(array)搜索?
search_nulls该列是否支持IS NULLIS NOT NULL搜索?

表 9.65. 指数属性

NameDescription
clusterable可以在CLUSTER命令中使用索引吗?
index_scan索引是否支持普通(非位图)扫描?
bitmap_scan索引是否支持位图扫描?
backward_scan可以在扫描中途更改扫描方向(以在光标上支持FETCH BACKWARD而不需要实现)吗?

表 9.66. 索引访问方法属性

NameDescription
can_order访问方法是否支持CREATE INDEX中的ASCDESC和相关关键字?
can_unique访问方法是否支持唯一索引?
can_multi_col访问方法是否支持多列索引?
can_exclude访问方法是否支持排除约束?
can_include访问方法是否支持CREATE INDEXINCLUDE子句?

传递pg_class时,pg_options_to_table返回存储选项名称/值对(* option_name / option_value *)的集合。 reloptionspg_attributeattoptions

pg_tablespace_databases允许检查表空间。它返回数据库的 OID 集合,这些数据库的对象存储在表空间中。如果此函数返回任何行,则表空间不为空,无法删除。要显示填充表空间的特定对象,您将需要连接到pg_tablespace_databases标识的数据库并查询其pg_class目录。

pg_typeof返回传递给它的值的数据类型的 OID。这对于故障排除或动态构建 SQL 查询可能会有所帮助。该函数声明为返回regtype,这是 OID 别名类型(请参见Section 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_regprocedureto_regoperto_regoperatorto_regtypeto_regnamespaceto_regrole函数将关系,函数,运算符,类型,架构和角色名称(指定为text)转换为regclassregprocregprocedureregoperregoperator类型的对象,regtyperegnamespaceregrole。这些函数与文本转换的不同之处在于它们不接受数字 OID,并且如果找不到名称(或者对于to_regprocto_regoper,如果给定名称与多个对象匹配),它们将返回 null 而不是引发错误。 )。

Table 9.67列出了与数据库对象标识和寻址有关的功能。

表 9.67. 对象信息和寻址功能

NameReturn TypeDescription
pg_describe_object(classid oid, objid oid, objsubid integer)text获取数据库对象的描述
pg_identify_object(classid oid, objid oid, objsubid integer)type text , schema text , name text , identity text获取数据库对象的身份
pg_identify_object_as_address(classid oid, objid oid, objsubid integer)type text , object_names text[] , object_args text[]获取数据库对象地址的外部表示
pg_get_object_address(type text, object_names text[], object_args text[])classid oid , objid oid , objsubid integer从其外部表示中获取数据库对象的地址

pg_describe_object返回由目录 OID,对象 OID 和子对象 ID(例如表中的列号;在引用整个对象时,子对象 ID 为零)指定的数据库对象的文本描述。此描述旨在使用户可以阅读,并且可以根据服务器配置进行翻译。这对于确定存储在pg_depend目录中的对象的身份很有用。

pg_identify_object返回包含足够信息的行,以唯一地标识由目录 OID,对象 OID 和子对象 ID 指定的数据库对象。该信息旨在机器可读,并且永远不会翻译。 * type *标识数据库对象的类型; * schema *是对象所属的模式名称,或者NULL用于不属于模式的对象类型; * name *是对象的名称,如果名称(连同模式名称,如果相关)足以唯一地标识对象,则用引号括起来,否则NULL; * identity *是完整的对象标识,其精确格式取决于对象类型,并且格式中的每个名称均经过模式限定,并在需要时用引号引起来。

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

pg_get_object_address返回包含足够信息的行,以唯一地标识由数据库对象的类型,对象名称和参数数组指定的数据库对象。返回的值是将在系统目录(例如pg_depend)中使用的值,并且可以传递给其他系统函数(例如pg_identify_objectpg_describe_object)。 * classid *是包含对象的系统目录的 OID; * objid 是对象本身的 OID, objsubid *是子对象 ID,如果没有则为零。此函数是pg_identify_object_as_address的反函数。

Table 9.68中显示的功能提取以前使用COMMENT命令存储的 Comments。如果找不到指定参数的 Comments,则返回空值。

表 9.68. Comment 信息功能

NameReturn TypeDescription
col_description(table_oid, column_number)text获取表列的 Comments
obj_description(object_oid, catalog_name)text获取数据库对象的 Comments
obj_description(object_oid)text获取数据库对象的 Comments(不建议使用)
shobj_description(object_oid, catalog_name)text获取共享数据库对象的 Comments

col_description返回表列的 Comments,该 Comments 由其表的 OID 及其列号指定。 (obj_description不能用于表列,因为列本身没有 OID.)

obj_description的两参数形式返回由数据库对象的 OID 和包含的系统目录的名称指定的 Comments。例如,obj_description(123456,'pg_class')将检索 OID 为 123456 的表的 Comments。obj_description的单参数形式仅需要对象 OID。不建议使用此方法,因为不能保证 OID 在不同的系统目录中是唯一的。因此,可能会返回错误的 Comments。

shobj_description的用法与obj_description相似,只是用于检索共享对象上的 Comments。一些系统目录对于每个集群中的所有数据库都是全局的,并且其中对象的描述也都全局存储。

Table 9.69中显示的功能以可导出的形式提供服务器事务信息。这些功能的主要用途是确定在两个快照之间提交了哪些事务。

表 9.69. TransactionID 和快照

NameReturn TypeDescription
txid_current()bigint获取当前 TransactionID,如果当前 Transaction 没有 ID,则分配一个新的 ID
txid_current_if_assigned()biginttxid_current()相同,但如果没有分配新的 TransactionID,则返回 null 而不是分配新的 TransactionID
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快照中是否显示 TransactionID? (请勿与子 TransactionID 一起使用)
txid_status(bigint)text报告给定 Transaction 的状态:committedabortedin progress;如果 TransactionID 太旧,则返回 null

内部事务 ID 类型(xid)为 32 位宽,每 40 亿个事务回绕一次。但是,这些函数将导出 64 位格式,并以“ epoch”计数器进行扩展,因此在安装期间不会回绕。这些函数txid_snapshot使用的数据类型存储有关特定时间的事务 ID 可见性的信息。其组件在Table 9.70中描述。

表 9.70. 快照组件

NameDescription
xmin仍处于活动状态的最早的事务 ID(txid)。所有先前的事务将被提交并可见,或者回滚并终止。
xmax第一个尚未分配的 txid。截至快照时,所有大于或等于此值的 txid 尚未开始,因此不可见。
xip_list快照时的活动 txid。该列表仅包含xminxmax之间的活动 txid;可能存在高于xmax的活动 txid。 xmin <= txid < xmax不在此列表中的 txid 在快照时已经完成,因此根据其提交状态可见或不可用。该列表不包括子事务的 txid。

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

txid_status(bigint)报告最近事务的提交状态。当COMMIT进行时,当应用程序和数据库服务器断开连接时,应用程序可以使用它来确定事务是提交还是中止。事务的状态将报告为in progresscommittedaborted,前提是事务的最新程度足以使系统保留该事务的提交状态。如果足够老,无法在系统中保留对该事务的引用,并且提交状态信息已被丢弃,则此函数将返回 NULL。请注意,准备好的 Transaction 记录为in progress;应用程序必须检查pg_prepared_xacts是否需要确定 txid 是否是准备好的事务。

Table 9.71中显示的功能提供有关已提交的事务的信息。这些功能主要提供有关何时提交事务的信息。仅当启用track_commit_timestamp配置选项时,它们才提供有用的数据,并且仅针对启用后的事务。

表 9.71. 提交的 Transaction 信息

NameReturn TypeDescription
pg_xact_commit_timestamp(xid)timestamp with time zone获取事务的提交时间戳
pg_last_committed_xact()xid xid , timestamp timestamp with time zone获取事务 ID 和最近提交的事务的提交时间戳

Table 9.72中显示的功能会打印initdb期间初始化的信息,例如目录版本。它们还显示有关预写日志记录和检查点处理的信息。此信息是群集范围的,而不特定于任何一个数据库。它们以更适合 SQL 函数的形式提供了与pg_controldata来自同一来源的大多数相同信息。

表 9.72. 控制数据功能

NameReturn TypeDescription
pg_control_checkpoint()record返回有关当前检查点状态的信息。
pg_control_system()record返回有关当前控制文件状态的信息。
pg_control_init()record返回有关集群初始化状态的信息。
pg_control_recovery()record返回有关恢复状态的信息。

pg_control_checkpoint返回一条记录,如Table 9.73所示

表 9.73. pg_control_checkpoint

Column NameData Type
checkpoint_lsnpg_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返回一条记录,如Table 9.74所示

表 9.74. pg_control_system

Column NameData Type
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

pg_control_init返回一条记录,如Table 9.75所示

表 9.75. pg_control_init

Column NameData Type
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返回一条记录,如Table 9.76所示

表 9.76. pg_control_recovery

Column NameData Type
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean