9.25. 系统信息函数
表 9.60 显示了提取会话和系统信息的几个函数。
除了本节中列出的功能外,还有许多与统计系统相关的功能,它们还提供系统信息。有关更多信息,请参见第 28.2.2 节。
表 9.60.会话信息函数
| 名字 | 返回类型 | 描述 |
|---|---|---|
current_catalog | name | 当前数据库的名称(在SQL标准中称为“目录”) |
current_database() | name | 当前数据库的名称 |
current_query() | text | 客户端提交的当前正在执行的查询的文本(可能包含多个语句) |
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 编译器扩展(请参阅第 32 章),并且 JIT 配置参数设置为 。on |
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() | int | PostgreSQL 触发器的当前嵌套级别(如果未从触发器内部直接或间接调用,则为 0) |
session_user | name | 会话用户名 |
user | name | 相当于current_user |
version() | text | PostgreSQL 版本信息。另请参阅机器可读版本的server_version_num。 |
注意
current_catalog、、 ,并在 SQL 中具有特殊的语法状态:调用它们时必须不带尾随括号。(在PostgreSQL中,括号可以选择与,但不能与其他括号一起使用。current_role``current_schema``current_user``session_user``user``current_schema
通常是启动当前数据库连接的用户;但超级用户可以使用设置会话授权更改此设置。是适用于权限检查的用户标识符。通常它等于会话用户,但可以使用 SET ROLE 进行更改。在执行具有属性的函数期间,它也会发生变化。在Unix术语中,会话用户是“真实用户”,当前用户是“有效用户”。 并且是 的同义词。(SQL标准区分了和,但PostgreSQL没有,因为它将用户和角色统一到一种实体中。session_user``current_user``SECURITY DEFINER``current_role``user``current_user``current_role``current_user
current_schema返回搜索路径中第一个架构的名称(如果搜索路径为空,则返回 null 值)。这是将用于在未指定目标架构的情况下创建的任何表或其他命名对象的架构。 返回搜索路径中当前所有架构的名称数组。布尔值选项确定是否隐式包含的系统架构,例如是否包含在返回的搜索路径中。current_schemas(boolean)``pg_catalog
注意
可以在运行时更改搜索路径。该命令是:
SET search_path TO schema [, schema, ...]
inet_client_addr返回当前客户端的 IP 地址,并返回端口号。 返回服务器接受当前连接的 IP 地址,并返回端口号。如果当前连接是通过 Unix 域套接字进行的,则所有这些函数都返回 NULL。inet_client_port``inet_server_addr``inet_server_port
pg_blocking_pids返回具有指定进程 ID 阻止服务器进程的会话的进程 ID 的数组,如果没有此类服务器进程或未被阻止,则返回空数组。如果一个服务器进程持有与被阻止进程的锁定请求冲突的锁(硬块),或者正在等待与被阻止进程的锁定请求冲突的锁,并且在等待队列中位于该进程的前面(软块),则该服务器进程会阻止另一个服务器进程。使用并行查询时,结果始终列出客户端可见的进程 ID(即结果),即使实际锁由子工作进程持有或等待也是如此。因此,结果中可能存在重复的 PID。另请注意,当准备好的事务持有冲突锁时,它将在此函数的结果中由零进程 ID 表示。频繁调用此函数可能会对数据库性能产生一些影响,因为它需要在短时间内独占访问锁管理器的共享状态。pg_backend_pid
pg_conf_load_time返回上次加载服务器配置文件的时间。(如果当前会话当时处于活动状态,这将是会话本身重新读取配置文件的时间,因此不同会话中的读取会略有不同。否则,这是邮局主管进程重新读取配置文件的时间。timestamp with time zone
pg_current_logfile返回 AS 日志文件当前由日志记录收集器使用的路径。该路径包括log_directory目录和日志文件名。必须启用日志收集,否则返回值为 。当存在多个日志文件时,每个日志文件采用不同的格式,调用不带参数返回具有排序列表中找到的第一种格式的文件的路径:stderr,csvlog。 当没有日志文件具有任何这些格式时返回。要请求特定的文件格式供应,请将 csvlog 或 stderr 作为可选参数的值。返回值是当请求的日志格式不是配置的log_destination时。反映文件的内容。text``NULL``pg_current_logfile``NULL``text``NULL``pg_current_logfile``current_logfiles
pg_my_temp_schema返回当前会话临时架构的 OID,如果它没有,则返回零(因为它尚未创建任何临时表)。 如果给定的 OID 是另一个会话的临时架构的 OID,则返回 true。(例如,这对于从目录显示中排除其他会话的临时表非常有用。pg_is_other_temp_schema
pg_listening_channels返回当前会话正在侦听的异步通知通道的一组名称。 返回等待处理的通知当前占用的通知总可用空间的比例,范围为 0-1。有关详细信息,请参阅侦听和通知。pg_notification_queue_usage``double
pg_postmaster_start_time返回服务器启动的时间。timestamp with time zone
pg_safe_snapshot_blocking_pids返回阻止具有指定进程 ID 的服务器进程获取安全快照的会话的进程 ID 的数组,如果没有此类服务器进程或未被阻止,则返回空数组。运行事务的会话会阻止事务获取快照,直到后者确定可以安全地避免使用任何谓词锁。有关可序列化和可延期事务的更多信息,请参见第 13.2.3 节。频繁调用此函数可能会对数据库性能产生一些影响,因为它需要在短时间内访问谓词锁管理器的共享状态。SERIALIZABLE``SERIALIZABLE READ ONLY DEFERRABLE
version返回一个描述 PostgreSQL 服务器版本的字符串。您还可以从server_version或机器可读版本(server_version_num)获取此信息。软件开发人员应该使用(从 8.2 开始可用)或 PQserverVersion,而不是解析文本版本。server_version_num
表 9.61 列出了允许用户以编程方式查询对象访问权限的函数。有关特权的更多信息,请参见第 5.6 节。
表 9.61.访问权限查询功能
| 名字 | 返回类型 | 描述 |
|---|---|---|
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 () 指定用户以指示 PUBLIC 伪角色,或者假设省略参数。可以通过名称或 OID 指定表。(因此,实际上有六种变体,可以通过其参数的数量和类型来区分。按名称指定时,如有必要,可以对名称进行架构限定。所需的访问权限类型由文本字符串指定,该字符串的计算结果必须为 、 或 之一。(可选)可以添加到权限类型中,以测试是否使用授予选项持有该权限。此外,可以列出多个权限类型,以逗号分隔,在这种情况下,如果持有任何列出的权限,则结果将是。(权限字符串的大小写并不重要,权限名称之间允许有额外的空格,但不允许在权限名称内留出额外的空格。一些例子:pg_authid.oid``public``current_user``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检查用户是否可以以特定方式访问表的任何列。它的参数可能性类似于 ,不同之处在于所需的访问权限类型必须计算为 、、 或 的某种组合。请注意,在表级别拥有这些特权中的任何一个都会隐式授予它对表的每一列的权限,因此对于相同的参数,将始终返回 if 。但是,如果对至少一列的权限授予了列级权限,则也会成功。has_table_privilege``SELECT``INSERT``UPDATE``REFERENCES``has_any_column_privilege``true``has_table_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检查用户是否可以以特定方式访问函数。它的参数可能性类似于 。当通过文本字符串而不是 OID 指定函数时,允许的输入与数据类型相同(请参阅第 8.19 节)。所需的访问权限类型的计算结果必须为 。一个例子是:has_table_privilege``regprocedure``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检查用户是否可以以特定方式访问类型。它的参数可能性类似于 。通过文本字符串而不是 OID 指定类型时,允许的输入与数据类型相同(请参阅第 8.19 节)。所需的访问权限类型的计算结果必须为 。has_table_privilege``regtype``USAGE
pg_has_role检查用户是否可以以特定方式访问角色。它的参数可能性类似于 ,只是不允许作为用户名。所需的访问权限类型的计算结果必须为 或 的某种组合。 表示角色中的直接或间接成员资格(即执行权限),而表示角色的特权是否无需执行即可立即可用。has_table_privilege``public``MEMBER``USAGE``MEMBER``SET ROLE``USAGE``SET ROLE
row_security_active检查 和 环境中指定表的行级别安全性是否处于活动状态。可以通过名称或 OID 指定表。current_user
表 9.62 显示了确定某个对象在当前架构搜索路径中是否可见的函数。例如,如果某个表的包含架构位于搜索路径中,并且搜索路径中没有同名表出现,则称该表可见。这等效于无需显式架构限定即可按名称引用表的语句。列出所有可见表的名称:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 9.62.架构可见性查询函数
| 名字 | 返回类型 | 描述 |
|---|---|---|
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);
请注意,以这种方式测试非架构限定的类型名称没有多大意义 — 如果该名称可以识别,则它必须是可见的。
表 9.63 列出了从系统目录中提取信息的函数。
表 9.63.系统目录信息函数
| 名字 | 返回类型 | 描述 |
|---|---|---|
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 | 函数的 get 子句(为过程返回 null)RETURNS |
pg_get_indexdef(index_oid) | text | 获取索引命令CREATE INDEX |
pg_get_indexdef(index_oid, column_no, pretty_bool) | text | 获取索引命令,或当*column_no*不为零时仅定义一个索引列CREATE INDEX |
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 | 扩展统计信息对象的 get 命令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_constraintdef、、、 和 分别为约束、索引、规则、扩展统计信息对象或触发器重新构造创建命令。(请注意,这是一个反编译的重建,而不是命令的原始文本。 反编译单个表达式的内部形式,如列的默认值。它在检查系统目录的内容时很有用。如果表达式可能包含 Var,请指定它们引用的关系的 OID 作为第二个参数;如果预期没有 Var,则零就足够了。 重新构造定义视图的查询。这些函数中的大多数都有两种变体,其中一种可以选择“漂亮打印”结果。漂亮的打印格式更具可读性,但默认格式更有可能被未来版本的 PostgreSQL 以相同的方式解释;避免将漂亮的打印输出用于转储目的。传递漂亮的打印参数会产生与根本没有该参数的变体相同的结果。pg_get_indexdef``pg_get_ruledef``pg_get_statisticsobjdef``pg_get_triggerdef``pg_get_expr``pg_get_viewdef``SELECT``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 节)。典型用途是读取标识列或序列列的序列的当前值,例如:serial``smallserial``bigserial``ALTER SEQUENCE OWNED BY``pg_get_owned_sequence``serial``bigserial
SELECT currval(pg_get_serial_sequence('sometable', 'id'));
pg_get_userbyid提取给定其 OID 的角色名称。
pg_index_column_has_property、 ,并返回指定的索引列、索引或索引访问方法是否具有命名属性。 如果属性名称未知或不适用于特定对象,或者 OID 或列号未标识有效对象,则返回。有关列属性,请参阅表 9.64,有关索引属性,请参阅表 9.65,有关访问方法属性,请参阅表 9.66。(请注意,扩展访问方法可以为其索引定义其他属性名称。pg_index_has_property``pg_indexam_has_property``NULL
表 9.64.索引列属性
| 名字 | 描述 |
|---|---|
asc | 列在正向扫描中是否按升序排序? |
desc | 列在正向扫描时是否按降序排序? |
nulls_first | 在正向扫描中,列是否首先以空值排序? |
nulls_last | 列在正向扫描中是否以空值排序? |
orderable | 列是否具有任何定义的排序顺序? |
distance_orderable | 例如,是否可以由“距离”操作员按顺序扫描列?ORDER BY col <-> constant |
returnable | 仅索引扫描是否可以返回列值? |
search_array | 该列本身是否支持搜索?col = ANY(array) |
search_nulls | 该列是否支持和搜索?IS NULL``IS NOT NULL |
表 9.65.索引属性
| 名字 | 描述 |
|---|---|
clusterable | 索引可以在命令中使用吗?CLUSTER |
index_scan | 索引是否支持普通(非位图)扫描? |
bitmap_scan | 索引是否支持位图扫描? |
backward_scan | 是否可以在扫描过程中更改扫描方向(无需具体化即可支持光标)?FETCH BACKWARD |
表 9.66.索引访问方法属性
| 名字 | 描述 |
|---|---|
can_order | 访问方法是否支持 ,以及 中的相关关键字?ASC``DESC``CREATE INDEX |
can_unique | 访问方法是否支持唯一索引? |
can_multi_col | 访问方法是否支持具有多个列的索引? |
can_exclude | 访问方法是否支持排除约束? |
can_include | 访问方法是否支持 ?INCLUDE``CREATE INDEX |
pg_options_to_table传递时返回存储选项名称/值对 (option_name/option_value) 的集合。或。。pg_class``reloptions``pg_attribute``attoptions
pg_tablespace_databases允许检查表空间。它返回具有存储在表空间中的对象的数据库的 OID 集。如果此函数返回任何行,则表空间不为空,无法删除。要显示填充表空间的特定对象,您需要连接到由 标识的数据库并查询其目录。pg_tablespace_databases``pg_class
pg_typeof返回传递给它的值的数据类型的 OID。这对于排查或动态构造 SQL 查询很有帮助。该函数被声明为 return ,这是一个 OID 别名类型(参见第 8.19 节);这意味着出于比较目的,它与 OID 相同,但显示为类型名称。例如:regtype
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)
该值可能被引号并限定为架构限定值。如果没有为参数表达式派生排序规则,则返回 null 值。如果参数不是可折叠的数据类型,则会引发错误。
、、、、 和函数将关系、函数、运算符、类型、架构和角色名称(给定为 )分别转换为类型、 和的对象。这些函数与文本强制转换的不同之处在于,它们不接受数字 OID,并且在找不到名称时返回 null 而不是引发错误(或者,如果给定名称与多个对象匹配,则为 和 )。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``to_regproc``to_regoper
表 9.67 列出了与数据库对象标识和寻址相关的功能。
表 9.67.对象信息和寻址函数
| 名字 | 返回类型 | 描述 |
|---|---|---|
pg_describe_object(classid oid, objid oid, objsubid integer) | text | 获取数据库对象的描述 |
pg_identify_object(classid oid, objid oid, objsubid integer) | 类型 、 模式 、 名称 、 标识text``text``text text | 获取数据库对象的标识 |
pg_identify_object_as_address(classid oid, objid oid, objsubid integer) | 类型 , object_names , object_argstext``text[] text[] | 获取数据库对象地址的外部表示形式 |
pg_get_object_address(type text, object_names text[], object_args text[]) | classid , objid , objsubidoid``oid integer | 从数据库对象的外部表示形式获取其地址 |
pg_describe_object返回由目录 OID、对象 OID 和子对象 ID 指定的数据库对象的文本说明(例如表中的列号;引用整个对象时子对象 ID 为零)。此说明旨在供人类阅读,并且可能会被翻译,具体取决于服务器配置。这对于确定存储在目录中的对象的身份非常有用。pg_depend
pg_identify_object返回包含足够信息的行,以唯一标识由目录 OID、对象 OID 和子对象 ID 指定的数据库对象。此信息旨在供机器读取,并且永远不会被翻译。类型标识数据库对象的*类型;架构是对象所属的架构名称,或者不属于架构的对象类型;name* 是对象的名称,如有必要,如果名称(以及架构名称,如果相关)足以唯一标识对象,则引用;标识是完整的对象*标识*,其精确格式取决于对象类型,格式中的每个名称都是架构限定的,并根据需要引用。NULL``NULL
pg_identify_object_as_address返回包含足够信息的行,以唯一标识由目录 OID、对象 OID 和子对象 ID 指定的数据库对象。返回的信息独立于当前服务器,也就是说,它可用于标识另一个服务器中名称相同的对象。类型标识数据库对象的*类型;object_names* 和 object_args 是文本数组,它们共同构成对对象的引用。可以传递这三个值以获取对象的内部地址。此函数是 的反函数。pg_get_object_address``pg_get_object_address
pg_get_object_address返回包含足够信息的行,以唯一标识由其类型和对象名以及参数数组指定的数据库对象。返回的值是将在系统目录中使用的值,例如,并且可以传递给其他系统函数(如 或 )。classid 是包含对象的系统目录的 OID;objid 是对象本身的 OID,objsubid 是子对象 ID,如果没有,则为零。此函数是 的反函数。pg_depend``pg_identify_object``pg_describe_object``pg_identify_object_as_address
表 9.68 中所示的函数提取以前使用 COMMENT 命令存储的注释。如果找不到指定参数的注释,则返回 null 值。
表 9.68.注释信息函数
| 名字 | 返回类型 | 描述 |
|---|---|---|
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 及其列号指定。(不能用于表列,因为列没有自己的 OID。obj_description
的双参数形式返回由其 OID 指定的数据库对象的注释以及包含的系统目录的名称。例如,将检索具有 OID 123456的表的注释。的单参数形式只需要对象 OID。它已被弃用,因为无法保证 OID 在不同的系统目录中是唯一的;因此,可能会返回错误的注释。obj_description``obj_description(123456,'pg_class')``obj_description
shobj_description就像用于检索共享对象的注释一样使用。某些系统目录对于每个群集中的所有数据库都是全局的,并且其中对象的描述也是全局存储的。obj_description
表 9.69 中所示的函数以可导出的形式提供服务器事务信息。这些函数的主要用途是确定在两个快照之间提交了哪些事务。
表 9.69.事务 ID 和快照
| 名字 | 返回类型 | 描述 |
|---|---|---|
txid_current() | bigint | 获取当前事务 ID,如果当前事务没有 ID,则分配一个新 ID |
txid_current_if_assigned() | bigint | 与 相同,但返回 null 而不是分配新的事务 ID(如果尚未分配)txid_current() |
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 | 报告给定事务的状态:、、、,如果事务 ID 太旧,则为 nullcommitted``aborted``in progress |
内部事务 ID 类型 () 宽 32 位,每 4 亿个事务环绕一次。但是,这些函数导出使用 “epoch” 计数器扩展的 64 位格式,因此在安装的生命周期内不会环绕。这些函数使用的数据类型 存储有关特定时刻的事务 ID 可见性的信息。其组件如表9.70所述。xid``txid_snapshot
表 9.70.快照组件
| 名字 | 描述 |
|---|---|
xmin | 仍处于活动状态的最早事务 ID (txid)。所有早期的事务要么提交并可见,要么回滚并失效。 |
xmax | 第一个尚未分配的 txid。在快照时,所有大于或等于此值的 txid 尚未启动,因此不可见。 |
xip_list | 快照时的活动 txid。该列表仅包括 和 之间的活动 txid ;可能存在高于 的活动 Txid 。在此列表中和不在此列表中的 txid 在快照时已经完成,因此根据其提交状态可见或失效。该列表不包括子事务的 txid。xmin``xmax``xmax``xmin <= txid < xmax |
txid_snapshot的文本表示形式为 。例如表示 .xmin:xmax:xip_list``10:20:10,14,15``xmin=10, xmax=20, xip_list=10, 14, 15
txid_status(bigint)报告最近事务的提交状态。应用程序可以使用它来确定当应用程序和数据库服务器在 进行时断开连接时,事务是已提交还是中止。事务的状态将报告为 、 或 ,前提是该事务足够新,以至于系统保留该事务的提交状态。如果足够旧,以至于系统中没有对该事务的引用,并且提交状态信息已被丢弃,则此函数将返回 NULL。请注意,准备好的事务报告为 ;应用程序必须检查pg_prepared_xacts是否需要确定 Txid 是否为准备好的事务。COMMIT``in progress``committed``aborted``in progress
表 9.71 中所示的函数提供了有关已提交的事务的信息。这些函数主要提供有关事务提交时间的信息。它们仅在启用配置选项时提供有用的数据track_commit_timestamp并且仅适用于启用配置选项后提交的事务。
表 9.71.已提交的事务信息
| 名字 | 返回类型 | 描述 |
|---|---|---|
pg_xact_commit_timestamp(xid) | timestamp with time zone | 获取事务的提交时间戳 |
pg_last_committed_xact() | xid , 时间戳xid timestamp with time zone | 获取最近提交事务的事务 ID 和提交时间戳 |
表9.72中所示的函数打印信息初始化期间,如目录版本。它们还显示有关预写日志记录和检查点处理的信息。此信息是群集范围的,而不是特定于任何一个数据库。它们提供与pg_controldata相同的大多数信息,来自同一来源,尽管其形式更适合SQL函数。initdb
表 9.72.控制数据功能
| 名字 | 返回类型 | 描述 |
|---|---|---|
pg_control_checkpoint() | record | 返回有关当前检查点状态的信息。 |
pg_control_system() | record | 返回有关当前控件文件状态的信息。 |
pg_control_init() | record | 返回有关群集初始化状态的信息。 |
pg_control_recovery() | record | 返回有关恢复状态的信息。 |
pg_control_checkpoint返回一条记录,如表 9.73 所示
表 9.73.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 | timestamp with time zone |
pg_control_system返回一条记录,如表 9.74 所示
表 9.74.pg_control_system列
| 列名 | 数据类型 |
|---|---|
pg_control_version | integer |
catalog_version_no | integer |
system_identifier | bigint |
pg_control_last_modified | timestamp with time zone |
pg_control_init返回一条记录,如表 9.75 所示
表 9.75.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 |
float4_pass_by_value | boolean |
float8_pass_by_value | boolean |
data_page_checksum_version | integer |
pg_control_recovery返回一条记录,如表 9.76 所示
表 9.76.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 |