On this page
9.25. 系统信息功能
Table 9.60显示了一些提取会话和系统信息的功能。
除了本节中列出的功能外,还有许多与统计系统有关的功能,这些功能还提供系统信息。有关更多信息,请参见Section 28.2.2。
表 9.60. 会话信息功能
Name | Return Type | Description |
---|---|---|
current_catalog |
name |
当前数据库的名称(在 SQL 标准中称为“目录”) |
current_database() |
name |
当前数据库名称 |
current_query() |
text |
Client 端提交的当前正在执行的查询的文本(可能包含多个语句) |
current_role |
name |
相当于current_user |
current_schema[()] |
name |
当前模式的名称 |
current_schemas(boolean) |
name[] |
搜索路径中模式的名称,可以选择包括隐式模式 |
current_user |
name |
当前执行上下文的用户名 |
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() |
int |
PostgreSQL 触发器的当前嵌套级别(如果未从触发器内部直接或间接调用,则为 0) |
session_user |
name |
会话用户名 |
user |
name |
相当于current_user |
version() |
text |
PostgreSQL 版本信息。另请参见server_version_num以获取机器可读版本。 |
Note
current_catalog
,current_role
,current_schema
,current_user
,session_user
和user
在 SQL 中具有特殊的语法状态:必须在不带括号的情况下调用它们。 (在 PostgreSQL 中,圆括号可以选择与current_schema
一起使用,但不能与其他括号一起使用.)
session_user
通常是发起当前数据库连接的用户;但是超级用户可以使用设置会话授权更改此设置。 current_user
是适用于权限检查的用户标识符。通常,它等于会话用户,但是可以使用SET ROLE进行更改。在执行具有属性SECURITY DEFINER
的功能时,它也会更改。用 Unix 的话来说,会话用户是“真实用户”,当前用户是“有效用户”。 current_role
和user
是current_user
的同义词。 (SQL 标准在current_role
和current_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,则返回值为NULL
。 pg_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.有关更多信息,请参见LISTEN和NOTIFY。
服务器启动时,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. 访问权限查询功能
Name | Return Type | Description |
---|---|---|
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
的六个变体,可以通过其参数的数量和类型来区分.)按名称指定时,必要时可以使用模式限定的名称。所需的访问特权类型由文本字符串指定,该文本字符串的值必须为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
对相同的参数执行此操作,则has_any_column_privilege
将始终返回true
。但是,如果有至少一个列的列级特权授予,则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 指定函数时,允许的 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
。所需的访问特权类型必须计算为CREATE
或USAGE
的某种组合。
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
作为用户名。所需的访问特权类型必须评估为MEMBER
或USAGE
的某种组合。 MEMBER
表示角色的直接或间接成员身份(即,执行SET ROLE
的权限),而USAGE
表示是否无需进行SET ROLE
即可立即获得角色的特权。
row_security_active
在current_user
和环境的上下文中检查指定表的行级安全性是否处于活动状态。该表可以通过名称或 OID 指定。
Table 9.62显示确定当前模式搜索路径中某个对象是否“可见”的函数。例如,如果包含表的表位于搜索路径中,并且在搜索路径中较早出现的同名表,则认为该表可见。这等效于以下声明:可以通过名称引用表而无需显式模式限定。列出所有可见表的名称:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 9.62. 模式可见性查询功能
Name | Return Type | Description |
---|---|---|
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 别名类型(regclass
,regtype
,regprocedure
,regoperator
,regconfig
或regdictionary
),例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
请注意,以这种方式测试非模式限定的类型名称没有多大意义-如果可以完全识别该名称,则该名称必须可见。
Table 9.63列出了从系统目录中提取信息的功能。
表 9.63. 系统目录信息功能
Name | Return Type | Description |
---|---|---|
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_constraintdef
,pg_get_indexdef
,pg_get_ruledef
,pg_get_statisticsobjdef
和pg_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。如果列是标识列,则关联的序列是为标识列在内部创建的序列。对于使用一种串行类型(serial
,smallserial
,bigserial
)创建的列,这是为该串行列定义创建的序列。在后一种情况下,可以使用ALTER SEQUENCE OWNED BY
修改或删除此关联。 (该函数可能应该被称为pg_get_owned_sequence
;其当前名称反映了它通常与serial
或bigserial
列一起使用的事实.)第一个 Importing 参数是具有可选模式的表名,第二个参数是列名。由于第一个参数可能是模式和表,因此不会将其视为双引号标识符,这意味着默认情况下将其小写,而将第二个参数(仅是列名)视为双引号,并且将其保留大小写。该函数返回一个适当格式的值,以传递给序列函数(请参见Section 9.16)。典型的用途是读取标识或序列列的序列的当前值,例如:
SELECT currval(pg_get_serial_sequence('sometable', 'id'));
pg_get_userbyid
根据给定的 OID 提取角色的名称。
pg_index_column_has_property
,pg_index_has_property
和pg_indexam_has_property
返回指定的索引列,索引或索引访问方法是否具有 named 属性。如果属性名称未知或不适用于特定对象,或者 OID 或列号不能标识有效对象,则返回NULL
。请参阅Table 9.64的列属性,Table 9.65的索引属性,和Table 9.66的访问方法属性。 (请注意,扩展访问方法可以为其索引定义其他属性名称.)
表 9.64. 索引栏属性
Name | Description |
---|---|
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 NULL 和IS NOT NULL 搜索? |
表 9.65. 指数属性
Name | Description |
---|---|
clusterable |
可以在CLUSTER 命令中使用索引吗? |
index_scan |
索引是否支持普通(非位图)扫描? |
bitmap_scan |
索引是否支持位图扫描? |
backward_scan |
可以在扫描中途更改扫描方向(以在光标上支持FETCH BACKWARD 而不需要实现)吗? |
表 9.66. 索引访问方法属性
Name | Description |
---|---|
can_order |
访问方法是否支持CREATE INDEX 中的ASC ,DESC 和相关关键字? |
can_unique |
访问方法是否支持唯一索引? |
can_multi_col |
访问方法是否支持多列索引? |
can_exclude |
访问方法是否支持排除约束? |
can_include |
访问方法是否支持CREATE INDEX 的INCLUDE 子句? |
传递pg_class
时,pg_options_to_table
返回存储选项名称/值对(* option_name
/ option_value
*)的集合。 reloptions
或pg_attribute
。 attoptions
。
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_regclass
,to_regproc
,to_regprocedure
,to_regoper
,to_regoperator
,to_regtype
,to_regnamespace
和to_regrole
函数将关系,函数,运算符,类型,架构和角色名称(指定为text
)转换为regclass
,regproc
,regprocedure
,regoper
,regoperator
类型的对象,regtype
,regnamespace
和regrole
。这些函数与文本转换的不同之处在于它们不接受数字 OID,并且如果找不到名称(或者对于to_regproc
和to_regoper
,如果给定名称与多个对象匹配),它们将返回 null 而不是引发错误。 )。
Table 9.67列出了与数据库对象标识和寻址有关的功能。
表 9.67. 对象信息和寻址功能
Name | Return Type | Description |
---|---|---|
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_object
或pg_describe_object
)。 * classid
*是包含对象的系统目录的 OID; * objid
是对象本身的 OID, objsubid
*是子对象 ID,如果没有则为零。此函数是pg_identify_object_as_address
的反函数。
Table 9.68中显示的功能提取以前使用COMMENT命令存储的 Comments。如果找不到指定参数的 Comments,则返回空值。
表 9.68. Comment 信息功能
Name | Return Type | Description |
---|---|---|
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 和快照
Name | Return Type | Description |
---|---|---|
txid_current() |
bigint |
获取当前 TransactionID,如果当前 Transaction 没有 ID,则分配一个新的 ID |
txid_current_if_assigned() |
bigint |
与txid_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 的状态:committed ,aborted ,in progress ;如果 TransactionID 太旧,则返回 null |
内部事务 ID 类型(xid
)为 32 位宽,每 40 亿个事务回绕一次。但是,这些函数将导出 64 位格式,并以“ epoch”计数器进行扩展,因此在安装期间不会回绕。这些函数txid_snapshot
使用的数据类型存储有关特定时间的事务 ID 可见性的信息。其组件在Table 9.70中描述。
表 9.70. 快照组件
Name | Description |
---|---|
xmin |
仍处于活动状态的最早的事务 ID(txid)。所有先前的事务将被提交并可见,或者回滚并终止。 |
xmax |
第一个尚未分配的 txid。截至快照时,所有大于或等于此值的 txid 尚未开始,因此不可见。 |
xip_list |
快照时的活动 txid。该列表仅包含xmin 和xmax 之间的活动 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 progress
,committed
或aborted
,前提是事务的最新程度足以使系统保留该事务的提交状态。如果足够老,无法在系统中保留对该事务的引用,并且提交状态信息已被丢弃,则此函数将返回 NULL。请注意,准备好的 Transaction 记录为in progress
;应用程序必须检查pg_prepared_xacts是否需要确定 txid 是否是准备好的事务。
Table 9.71中显示的功能提供有关已提交的事务的信息。这些功能主要提供有关何时提交事务的信息。仅当启用track_commit_timestamp配置选项时,它们才提供有用的数据,并且仅针对启用后的事务。
表 9.71. 提交的 Transaction 信息
Name | Return Type | Description |
---|---|---|
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. 控制数据功能
pg_control_checkpoint
返回一条记录,如Table 9.73所示
表 9.73. 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 |
pg_control_system
返回一条记录,如Table 9.74所示
表 9.74. 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 |
pg_control_init
返回一条记录,如Table 9.75所示
表 9.75. 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 |
float4_pass_by_value |
boolean |
float8_pass_by_value |
boolean |
data_page_checksum_version |
integer |
pg_control_recovery
返回一条记录,如Table 9.76所示
表 9.76. 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 |