Postgresql 中文操作指南

9.26. System Information Functions and Operators #

本部分中描述的函数用于获取有关 PostgreSQL 安装的各种信息。

9.26.1. Session Information Functions #

Table 9.67 显示了几个提取会话和系统信息的函数。

除了本节中列出的函数,还有一些与统计系统相关的函数,它们也提供了系统信息。请参阅 Section 28.2.25 了解更多信息。

Table 9.67. Session Information Functions

Function

Description

current_catalogname current_database () → name 返回当前数据库的名称。(在 SQL 标准中,数据库被称为“目录”,所以 current_catalog 是该标准的拼写。)

current_query () → text 返回客户端提交的当前执行查询的文本(可能包含一条以上的语句)。

current_rolename 这等同于 current_user

current_schemaname current_schema () → name 返回搜索路径中第一个模式的名称(或者如果搜索路径为空,则返回 null 值)。这是对于不指定目标模式所创建的任何表或其他命名对象将要使用的模式。

current_schemas ( include_implicit boolean ) → 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 地址,或 NULL 如果当前连接通过 Unix 域套接字进行。

inet_server_port () → integer 返回服务接受当前连接的 IP 端口号,或 NULL 如果当前连接通过 Unix 域套接字进行。

pg_backend_pid () → integer 返回附加到当前会话的服务器进程的进程 ID。

pg_blocking_pids ( integer ) → integer[] 返回阻止服务器进程使用指定进程 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 返回在以下有序列表中找到的第一个格式的文件路径: stderrcsvlogjsonlog 。如果没有日志文件具有这些格式,则返回 NULL 。要请求关于特定日志文件格式的信息,请提供 csvlogjsonlogstderr 作为可选参数的值。如果在 log_destination 中未配置请求的日志格式,结果将为 NULL 。结果反映了 current_logfiles 文件的内容。

pg_my_temp_schema () → oid 返回当前会话临时架构的 OID,如果没有(因为它尚未创建任何临时表),则返回零。

pg_is_other_temp_schema ( oid ) → boolean 如果给定的 OID 是另一个会话的临时架构的 OID,则返回 true。(例如,这可能有助于从目录显示中排除其他会话的临时表。)

pg_jit_available () → boolean 如果 JIT 编译器扩展可用(参见 Chapter 32 ),并且 jit 配置参数设置为 on ,则返回 true。

pg_listening_channels () → setof text 返回当前会话正在监听的异步通知通道名称集。

pg_notification_queue_usage () → double precision 返回等待处理的通知占用异步通知队列最大大小的比例 (0-1)。有关更多信息,请参见 LISTENNOTIFY

pg_postmaster_start_time () → timestamp with time zone 返回服务器启动的时间。

pg_safe_snapshot_blocking_pids ( integer ) → integer[] 返回阻止服务器进程使用指定进程 ID 获取安全快照的会话的进程 ID 数组,如果不存在此类服务器进程或未被阻止,则返回一个空数组。运行 SERIALIZABLE 事务的会话在适当的快照被获取之前阻止 SERIALIZABLE READ ONLY DEFERRABLE 事务,直到后者确定对采取谓词锁是安全的。有关可序列化和可延迟事务的更多信息,请参见 Section 13.2.3 。频繁调用此函数可能会对数据库性能产生一些影响,因为它需要在很短的时间内访问谓词锁管理器的共享状态。

pg_trigger_depth () → integer 返回 PostgreSQL 触发器的当前嵌套级别(如果没有在触发器内部(直接或间接)调用,则为 0)。

session_username 返回会话用户的姓名。

system_usertext 返回在用户被分配数据库角色之前的身份验证周期中用户呈现的身份验证方法和身份(如果有)。如果用户尚未进行身份验证(例如,如果使用了 Trust authentication ),则它表示为 auth_method:identityNULL

username 这等效于 current_user

version () → text 返回描述 PostgreSQL 服务器版本字符串。你也可以从 server_version 获取此信息,或者对于可机器读版本,使用 server_version_num 。软件开发人员应使用 server_version_num (8.2 版本后可用)或 PQserverVersion 代替解析文本版本。

Note

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

session_user 通常是启动当前数据库连接的用户;但超级用户可以使用 SET SESSION AUTHORIZATION 更改此设置。 current_user 是适用于权限检查的用户标识符。通常它与会话用户相同,但可以使用 SET ROLE 更改它。它也会随着具有 SECURITY DEFINER 属性的函数的执行而更改。在 Unix 术语中,会话用户是“实际用户”而当前用户是“有效用户”。 current_roleusercurrent_user 的同义词。(SQL 标准在 current_rolecurrent_user 之间有区别,但 PostgreSQL 没有,因为它将用户和角色统一为单一类型的实体。)

9.26.2. Access Privilege Inquiry Functions #

Table 9.68 列出了允许以编程方式查询对象访问权限的函数。(有关权限的更多信息,请参阅 Section 5.7)。在这些函数中,可以通过名称或 OID(pg_authid.oid)指定要查询其权限的用户,或者如果名称指定为 public,则会检查 PUBLIC 伪角色的权限。此外,user 参数可以完全省略,在这种情况下,将假设 current_user。要查询的对象也可以通过名称或 OID 指定。通过名称指定时,如果相关,还可以包括架构名称。感兴趣的访问权限由文本字符串指定,该字符串必须针对对象的类型(例如 SELECT)求值为某个适当的权限关键字。此外,可以将 WITH GRANT OPTION 添加到权限类型中,以测试是否具有授予选项的权限。此外,还可以以逗号分隔的方式列出多个权限类型,在这种情况下,如果持有其中任何列出的权限,结果将显示 true。(权限字符串不区分大小写,并且权限名称之间允许多余的空格,但不允许权限名称内部出现空格。)以下列出了一些示例:

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

Table 9.68. Access Privilege Inquiry Functions

Function

Description

has_any_column_privilege ( [ user nameoid , ] table textoid , privilege text ) → boolean 用户是否具有表任何列的权限?如果对整个表授予权限,或者至少对一列授予列级权限,则此操作成功。允许的权限类型为 SELECTINSERTUPDATEREFERENCES

has_column_privilege ( [ user nameoid , ] table textoid , column textsmallint , privilege text ) → boolean 用户对指定表列是否有权限?无论是对整个表持有该权限还是对该列授予了列级权限,这个功能都能成功执行。可以用名称或属性编号 ( pg_attribute . attnum ) 指定列。允许的权限类型有 SELECTINSERTUPDATEREFERENCES

has_database_privilege ( [ user nameoid , ] database textoid , privilege text ) → boolean 用户对数据库是否有权限?允许的权限类型有 CREATECONNECTTEMPORARYTEMP (相当于 TEMPORARY )。

has_foreign_data_wrapper_privilege ( [ user nameoid , ] fdw textoid , privilege text ) → boolean 用户对外部数据包装器是否有权限?唯一允许的权限类型为 USAGE

has_function_privilege ( [ user nameoid , ] function textoid , privilege text ) → boolean 用户对函数是否有权限?唯一允许的权限类型为 EXECUTE 。用名称而不是 OID 指定函数时,允许的输入与 regprocedure 数据类型相同(请参阅 Section 8.19 )。例如:SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_language_privilege ( [ user nameoid , ] language textoid , privilege text ) → boolean 用户对语言是否有权限?唯一允许的权限类型为 USAGE

has_parameter_privilege ( [ user nameoid , ] parameter text , privilege text ) → boolean 用户对配置参数是否有权限?参数名称不区分大小写。允许的权限类型有 SETALTER SYSTEM

has_schema_privilege ( [ user nameoid , ] schema textoid , privilege text ) → boolean 用户对架构是否有权限?允许的权限类型有 CREATEUSAGE

has_sequence_privilege ( [ user nameoid , ] sequence textoid , privilege text ) → boolean 用户对序列是否有权限?允许的权限类型有 USAGESELECTUPDATE

has_server_privilege ( [ user nameoid , ] server textoid , privilege text ) → boolean 用户对外部服务器是否有权限?唯一允许的权限类型为 USAGE

has_table_privilege ( [ user nameoid , ] table textoid , privilege text ) → boolean 用户对表是否有权限?允许的权限类型有 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGER

has_tablespace_privilege ( [ user nameoid , ] tablespace textoid , privilege text ) → boolean 用户对表空间是否有权限?唯一允许的权限类型为 CREATE

has_type_privilege ( [ user nameoid , ] type textoid , privilege text ) → boolean 用户对数据类型是否有权限?唯一允许的权限类型为 USAGE 。用名称而不是 OID 指定类型时,允许的输入与 regtype 数据类型相同(请参阅 Section 8.19 )。

pg_has_role ( [ user nameoid , ] role textoid , privilege text ) → boolean 用户对角色是否有权限?允许的权限类型有 MEMBERUSAGESETMEMBER 表示对角色的直接或间接成员身份,而不管授予了哪些特定权限。 USAGE 表示可以立即使用角色的权限,而无需执行 SET ROLESET 表示是否可以使用 SET ROLE 命令切换到该角色。此功能不允许将 user 设置为 public 的特殊情况,因为 PUBLIC 伪角色永远不能成为真实角色的成员。

row_security_active ( table textoid ) → boolean 在当前用户和当前环境的上下文中,针对已指定的表启用了行级安全吗?

Table 9.69 显示了 aclitem 类型可用的运算符,它是访问权限的目录表示形式。有关如何读取访问权限值的信息,请参阅 Section 5.7

Table 9.69. aclitem Operators

Operator

Description

Example(s)

aclitem = aclitemboolean aclitem_s equal? (Notice that type _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

Table 9.70 显示了一些管理 aclitem 类型的其他函数。

Table 9.70. aclitem Functions

Function

Description

acldefault ( type "char" , ownerId oid ) → aclitem[] 构建一个 aclitem 数组,用于保存属于具有 OID ownerId 的角色的 type 类型的对象的默认访问权限。当对象 ACL 条目为 null 时,这表示将假定的访问权限。(默认访问权限在 Section 5.7 中描述。) type 参数必须是“c”( COLUMN )、“r”( TABLE 和表状对象)、“s”( SEQUENCE )、“d”( DATABASE )、“f ”( FUNCTIONPROCEDURE )、“l”( LANGUAGE )、“L”( LARGE OBJECT )、“n”( SCHEMA )、“p”( PARAMETER )、“t”( TABLESPACE )、“F”( FOREIGN DATA WRAPPER )、“S”( FOREIGN SERVER )或“T”( TYPEDOMAIN )。

aclexplode ( aclitem[] ) → setof record 以一组行的形式返回 aclitem 数组。如果授予者是伪角色 PUBLIC,则在 grantee 列中用零表示。每项授予的权限都表示为 SELECTINSERT 等(有关完整列表,请参阅 Table 5.1 )。请注意,每项权限都作为单独一行分开,因此 privilege_type 列中只出现一个关键字。

makeaclitem ( grantee oid , grantor oid , privileges text , is_grantable boolean ) → aclitem 构建具有给定属性的 aclitemprivileges 是权限名称(如 SELECTINSERT 等)的逗号分隔列表,所有这些权限都在结果中设置。(权限字符串的大小写不重要,并且允许在权限名称之间(但不允许在权限名称内部)有额外的空格。)

9.26.3. Schema Visibility Inquiry Functions #

Table 9.71 显示了确定某个对象是否在当前架构搜索路径中 visible 的函数。例如,如果其包含架构在搜索路径中,并且在搜索路径中前面没有出现名称相同的表格,则此表格被称为可见表格。这相当于以下说法:可以通过名称引用该表格,而无需进行显式架构限定。因此,要列出所有可见表格的名称:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

对于函数和运算符,如果在路径中没有同名 and argument data type(s) 对象出现,则被称作搜索路径中的对象是可见的。对于运算符类和系列族,名字和相关的索引访问方法都会被考虑。

Table 9.71. Schema Visibility Inquiry Functions

Function

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 类型(或域)在搜索路径中可见吗?

所有这些函数都需要对象 OID 以标识要检查的对象。如果你想按名称测试对象,可以使用 OID 别名类型(regclassregtyperegprocedureregoperatorregconfigregdictionary),例如:

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

请注意,以这种方式测试非模式限定类型名称没有太大意义——如果名称可以被识别,那么它一定是可见的。

9.26.4. System Catalog Information Functions #

Table 9.72 列出了从系统目录中提取信息的函数。

Table 9.72. System Catalog Information Functions

Function

Description

format_type ( type oid , typemod integer ) → text 返回由类型 OID 和可能的类型修饰符标识的数据类型的 SQL 名称。如果不知道具体修饰符,请为该类型修饰符传递 NULL。

pg_char_to_encoding ( encoding name ) → integer 将提供的编码名称转换为代表某些系统目录表中使用的内部标识符的整数。如果提供了未知的编码名称,则返回 -1

pg_encoding_to_char ( encoding integer ) → name 将某些系统目录表中用作编码内部标识符的整数转换为可读的字符串。如果提供了无效的编码编号,则返回空字符串。

pg_get_catalog_foreign_keys () → setof record ( fktable regclass , fkcols text[] , pktable regclass , pkcols text[] , is_array boolean , is_opt boolean )返回一组记录,描述 PostgreSQL 系统目录中存在的外部键关系。 fktable 列包含引用目录的名称,而 fkcols 列包含引用列的名称。类似地, pktable 列包含被引用目录的名称,而 pkcols 列包含被引用列的名称。如果 is_array 为 true,最后一个引用列是一个数组,数组的每个元素都应匹配被引用目录中的某个条目。如果 is_opt 为 true,引用列允许包含零值,而不使用有效引用。

pg_get_constraintdef ( constraint oid [, pretty boolean ] ) → text 为约束重建创建命令。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_expr ( expr pg_node_tree , relation oid [, pretty boolean ] ) → text 对存储在系统目录中的表达式进行反编译,例如列的默认值。如果表达式可能包含 Vars,请指定它们引用的关系的 OID 作为第二个参数;如果不期望 Vars,则传递 0 就足够了。

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

pg_get_function_arguments ( func oid ) → text 以它需要出现在 CREATE FUNCTION 中的形式重建函数或过程的参数列表(包括默认值)。

pg_get_function_identity_arguments ( func oid ) → text 以它需要出现在 ALTER FUNCTION 等命令中的形式重建用于识别函数或过程的参数列表。此表单省略默认值。

pg_get_function_result ( func oid ) → text 以它需要出现在 CREATE FUNCTION 中的形式重建函数的 RETURNS 子句。返回一个过程的 NULL

pg_get_indexdef ( index oid [, column integer , pretty boolean ] ) → text 为索引重建创建命令。(这是一种反编译重建,而不是命令的原始文本。)如果 column 已提供且不为零,则只重建该列的定义。

pg_get_keywords () → setof record ( word text , catcode "char" , barelabel boolean , catdesc text , baredesc text )返回一组记录,描述服务器识别的 SQL 关键字。 word 列包含关键字。 catcode 列包含一个类别代码:未保留关键字为 U ,可以是列名的关键字为 C ,可以是类型或函数名的关键字为 T ,完全保留的关键字为 R 。如果关键字可用作 SELECT 列表中的“裸”列标签, barelabel 列将包含 true ,如果它只能在 AS 后使用,则包含 falsecatdesc 列包含描述关键字类别的本地化字符串(如果存在)。 baredesc 列包含描述关键字的列标签状态的本地化字符串(如果存在)。

pg_get_partkeydef ( table oid ) → text 以它将在 CREATE TABLEPARTITION BY 子句中出现的方式重建分区表分区键的定义。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_ruledef ( rule oid [, pretty boolean ] ) → text 为规则重建创建命令。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_serial_sequence ( table text , column text ) → text 返回与列关联的序列的名称,如果没有关联的序列,则返回 NULL。如果该列是标识列,则关联的序列是为该列内部创建的序列。对于使用序列类型 ( serialsmallserialbigserial ) 之一创建的列,它是为该序列列定义创建的序列。在后一种情况下,可以使用 ALTER SEQUENCE OWNED BY 修改或删除关联关系。(这个函数可能应该被称为 pg_get_owned_sequence ;它当前的名称反映了以往它已被用于序列类型列的事实。)第一个参数是一个表名,可带可选模式,第二个参数是一个列名。由于第一个参数可能同时包含模式和表名,因此它按照通常的 SQL 规则进行解析,这意味着它默认为小写。第二个参数仅仅是一个列名,被视为文本并因此保留了大小写。结果的格式适合传递给序列函数(参见 Section 9.17 )。一个典型的用途是在读取标识或序列列的序列的当前值,例如:SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_statisticsobjdef ( statobj oid ) → text 为扩展的统计对象重建创建命令。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_triggerdef ( trigger oid [, pretty boolean ] ) → text 为触发器重建创建命令。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_userbyid ( role oid ) → name 返回给定其 OID 的角色的名称。

pg_get_viewdef ( view oid [, pretty boolean ] ) → text 为视图或物化视图重建基础 SELECT 命令。(这是一种反编译重建,而不是命令的原始文本。)

pg_get_viewdef ( view oid , wrap_column integer ) → text 为视图或物化视图重建基础 SELECT 命令。(在函数的此形式中,漂亮打印始终启用,并且会对长行进行换行,以尝试使它们比指定的列数短。)

pg_get_viewdef ( view text [, pretty boolean ] ) → text 为视图或物化视图重建基础 SELECT 命令,根据视图的文本名称而不是其 OID 进行操作。(不推荐使用;改用 OID 变量。)

pg_index_column_has_property ( index regclass , column integer , property text ) → boolean 测试索引列是否具有指定的属性。常见索引列属性在 Table 9.73 中列出。(请注意,扩展访问方法可以为其索引定义其他属性名称。)如果属性名称不为已知或不适用于特定对象,或者 OID 或列号未标识有效对象,则返回 NULL

pg_index_has_property ( index regclass , property text ) → boolean 测试索引是否具有命名属性。索引的常用属性在 Table 9.74 中列出。(请注意,扩展访问方法可为其索引定义其他属性名称。)如果属性名称未知或不适用于特定对象,或者如果 OID 未识别有效对象,则返回 NULL

pg_indexam_has_property ( am oid , property text ) → boolean 测试索引访问方法是否具有命名属性。访问方法属性在 Table 9.75 中列出。如果属性名称未知或不适用于特定对象,或者如果 OID 未识别有效对象,则返回 NULL

pg_options_to_table ( options_array text[] ) → setof record ( option_name text , option_value text )返回由 pg_class . reloptionspg_attribute . attoptions 的值表示的存储选项集。

pg_settings_get_flags ( guc text ) → text[] 返回与给定 GUC 关联的标志数组,或如果它不存在则返回 NULL 。如果 GUC 存在但不显示标志,则结果为空数组。仅公开 Table 9.76 中列出的最有用的标志。

pg_tablespace_databases ( tablespace oid ) → setof oid 返回存储在指定表空间中的对象的数据库的 OID 集。如果此函数返回任何行,则表空间不为空,并且无法删除。要识别填充表空间的特定对象,您需要连接到 pg_tablespace_databases 识别的数据库并查询其 pg_class 目录。

pg_tablespace_location ( tablespace oid ) → text 返回此表空间所在的的文件系统路径。

pg_typeof ( "any" ) → regtype 返回传递给它的值的类型的数据类型的 OID。这有助于对 SQL 查询进行故障排除或动态构建。该函数被声明为返回 regtype ,这是一个 OID 别名类型(参见 Section 8.19 );这意味着它与用于比较目的的 OID 相同,但显示的为类型名称。例如:SELECT pg_typeof(33); pg_typeof---- integerSELECT 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 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不会引发错误。

to_regcollation ( text ) → regcollation 将文本排序规则名称转换为其 OID。将字符串转换为 regcollation 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不会引发错误。

to_regnamespace ( text ) → regnamespace 将文本模式名称转换为其 OID。将字符串转换为 regnamespace 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不会引发错误。

to_regoper ( text ) → regoper 将文本运算符名称转换为其 OID。将字符串转换为 regoper 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称或名称不明确,此函数将返回 NULL 而不引发错误。

to_regoperator ( text ) → regoperator 将文本运算符名称(带参数类型)转换为其 OID。将字符串转换为 regoperator 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不引发错误。

to_regproc ( text ) → regproc 将文本函数或过程名称转换为其 OID。将字符串转换为 regproc 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称或名称不明确,此函数将返回 NULL 而不引发错误。

to_regprocedure ( text ) → regprocedure 将文本函数或过程名称(带参数类型)转换为其 OID。将字符串转换为 regprocedure 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不引发错误。

to_regrole ( text ) → regrole 将文本角色名称转换为其 OID。将字符串转换为 regrole 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不引发错误。

to_regtype ( text ) → regtype 将文本类型名称转换为其 OID。将字符串转换为 regtype 类型可以得到类似的结果(参见 Section 8.19 );但是,如果未找到名称,此函数将返回 NULL 而不引发错误。

大多数重构(反编译)数据库对象的功能都有一个可选的 pretty 标志,如果为 true,则会导致结果“漂亮打印”。漂亮打印会禁止不必要的括号,并添加空格以提高可读性。漂亮打印的格式更具可读性,但默认格式更有可能以相同方式由 PostgreSQL 的未来版本解释;因此,避免将漂亮打印的输出用于转储目的。为 pretty 参数传递 false 会产生与省略参数相同的结果。

Table 9.73. Index Column Properties

Name

Description

asc

列在正向扫描上按升序排列吗?

desc

列在正向扫描上按降序排列吗?

nulls_first

列在向前扫描时是否将 null 值排在第一位?

nulls_last

列在向前扫描时是否将 null 值排在最后一位?

orderable

列是否拥有任何已定义的排序顺序?

distance_orderable

该列可以按“距离”运算符(例如 ORDER BY col <→ constant )进行按序扫描吗?

returnable

列值可以通过仅索引扫描返回吗?

search_array

列是否原生支持 col = ANY(array) 搜索?

search_nulls

该列是否支持 IS NULLIS NOT NULL 搜索?

Table 9.74. Index Properties

Name

Description

clusterable

该索引可在 CLUSTER 命令中使用吗?

index_scan

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

bitmap_scan

该索引是否支持位图扫描?

backward_scan

扫描方向可以在扫描中间进行更改(以在游标上支持 FETCH BACKWARD ,而无需进行实体化)吗?

Table 9.75. Index Access Method Properties

Name

Description

can_order

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

can_unique

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

can_multi_col

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

can_exclude

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

can_include

访问方法是否支持 INCLUDECREATE INDEX 子句?

Table 9.76. GUC Flags

Flag

Description

EXPLAIN

带有此标志的参数包含在 EXPLAIN (SETTINGS) 命令中。

NO_SHOW_ALL

带有此标志的参数从 SHOW ALL 命令中排除。

NO_RESET

带有此标志的参数不支持 RESET 命令。

NO_RESET_ALL

带有此标志的参数从 RESET ALL 命令中排除。

NOT_IN_SAMPLE

带有此标志的参数默认不包含在 postgresql.conf 中。

RUNTIME_COMPUTED

带有此标志的参数是运行时计算得到的。

9.26.5. Object Information and Addressing Functions #

Table 9.77 列出了与数据库对象标识和寻址相关的函数。

Table 9.77. Object Information and Addressing Functions

Function

Description

pg_describe_object ( classid oid , objid oid , objsubid integer ) → text 返回由目录 OID、对象 OID 和子对象 ID(例如表中的列号;引用整个对象时的子对象 ID 为零)标识的数据库对象的文本说明。此说明旨在可由人类阅读,并且取决于服务器配置,可能会被翻译。特别值得注意的是,它可用来确定在 pg_depend 目录中引用的对象的标识。对于未定义的对象,此函数返回 NULL 值。

pg_identify_object ( classid oid , objid oid , objsubid integer ) → record ( type text , schema text , name text , identity text )返回包含足够信息来唯一标识由目录 OID、对象 OID 和子对象 ID 指定的数据库对象的行。此信息旨在可供机器读取,并且永远不会被翻译。 type 标识数据库对象类型; schema 是对象所属的架构名称,而对于不属于架构的对象类型,则为 NULLname 是对象的名称,必要时带引号,如果名称(如有,则包括架构名称)足以唯一标识对象,否则为 NULLidentity 是完整的对象标识,精确格式取决于对象类型,格式中的每个名称都是经过架构限定的,必要时加引号。未定义的对象标识为 NULL 值。

pg_identify_object_as_address ( classid oid , objid oid , objsubid integer ) → record ( type text , object_names text[] , object_args text[] )返回包含足够信息来唯一标识由目录 OID、对象 OID 和子对象 ID 指定的数据库对象的行。返回的信息与当前服务器无关,也就是说,它可用于标识另一台服务器中的同名对象。 type 标识数据库对象类型; object_namesobject_args 是文本数组,共同形成对对象的引用。这三个值可以传递给 pg_get_object_address 以获取对象的内部地址。

pg_get_object_address ( type text , object_names text[] , object_args text[] ) → record ( classid oid , objid oid , objsubid integer )返回包含足够信息来唯一标识由类型代码和对象名称和参数数组指定的数据库对象的行。返回的值将用在系统目录(例如 pg_depend )中;它们可以传递给其他系统函数,例如 pg_describe_objectpg_identify_objectclassid 是包含对象的系统目录的 OID; objid 是对象本身的 OID, objsubid 是子对象 ID(若无,则为零)。此函数是 pg_identify_object_as_address 的逆函数。未定义的对象标识为 NULL 值。

9.26.6. Comment Information Functions #

Table 9.78 中显示的函数提取先前用 COMMENT 命令存储的注释。如果找不到指定参数的注释,则返回 null 值。

Table 9.78. Comment Information Functions

Function

Description

col_description ( table oid , column integer ) → text 返回由其表的 OID 和列号指定的表列的注释。(由于列没有自己的 OID,因此不能使用 obj_description 指定表列。)

obj_description ( object oid , catalog name ) → text 返回由其 OID 和包含系统目录的名称指定的数据库对象的注释。例如, obj_description(123456, 'pg_class') 将检索具有 OID 123456 的表的注释。

obj_description ( object oid ) → text 返回由其 OID 单独指定的数据库对象的注释。此方法与 deprecated 类似,因为无法保证不同系统目录中 OID 的唯一性;因此,可能会返回错误的注释。

shobj_description ( object oid , catalog name ) → text 返回由其 OID 和包含系统目录的名称指定的共享数据库对象的注释。这与 obj_description 相同,除了它用于检索共享对象(即,数据库、角色和表空间)上的注释。一些系统目录对每个群集中的所有数据库都是全局的,并且这些对象中的描述也全局存储。

9.26.7. Data Validity Checking Functions #

Table 9.79 中显示的函数可帮助检查要输入数据的有效性。

Table 9.79. Data Validity Checking Functions

Function

Description

Example(s)

pg_input_is_valid ( string text , type text ) → boolean 测试给定的 string 是否是指定数据类型的有效输入,返回 true 或 false。此函数仅在数据类型的输入函数已更新为将无效输入报告为“软”错误时按预期工作。否则,无效输入将中止事务,就像直接将该字符串强制转换为该类型一样。 pg_input_is_valid('42', 'integer')t pg_input_is_valid('42000000000', 'integer')f pg_input_is_valid('1234.567', 'numeric(7,4)')f

pg_input_error_info ( string text , type text ) → record ( message text , detail text , hint text , sql_error_code text )测试给定的 string 是否是指定数据类型的有效输入;如果无效,则返回将抛出的错误的详细信息。如果输入有效,则结果为 NULL。输入与 pg_input_is_valid 相同。此函数仅在数据类型的输入函数已更新为将无效输入报告为“软”错误时按预期工作。否则,无效输入将中止事务,就像直接将该字符串强制转换为该类型一样。 select * from pg_input_error_info('42000000000', 'integer') → 消息

detail

hint

sql_error_code--------------------------------------------------------------------+---------------- 值 "42000000000" 超出整数类型的范围

22003 select message, detail from pg_input_error_info('1234.567', 'numeric(7,4)') → 消息

detail ------------------------+----------------------------------​------------------------------------------------- numeric field overflow

精度为 7、比例为 4 的字段必须舍入到绝对值小于 10^3。

9.26.8. Transaction ID and Snapshot Information Functions #

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

Table 9.80. Transaction ID and Snapshot Information Functions

Function

Description

pg_current_xact_id () → xid8 返回当前事务的 ID。如果当前事务尚无 ID(因为它尚未执行任何数据库更新),则将分配一个新的 ID;有关详细信息,请参阅 Section 74.1 。如果在子事务中执行,则将返回顶级事务 ID;有关详细信息,请参阅 Section 74.3

pg_current_xact_id_if_assigned () → xid8 返回当前事务的 ID,或在尚未分配 ID 的情况下返回 NULL 。(如果事务可能是只读事务,最好使用此变体,以避免不必要地消耗 XID。)如果在子事务中执行,则将返回顶级事务 ID。

pg_xact_status ( xid8 ) → text 报告最近一次事务的提交状态。结果为 in progresscommittedaborted 之一,前提是该事务足够新,以至于系统保留了该事务的提交状态。如果该事务足够旧,以至于系统中没有该事务的任何引用并且提交状态信息已被丢弃,则结果为 NULL 。应用程序可以使用此函数(例如,在 COMMIT 正在进行时应用程序和数据库服务器断开连接之后)来确定事务是已提交还是已中止。请注意,已准备好的事务将被报告为 in progress ;如果应用程序需要确定事务 ID 是否属于已准备好的事务,则必须检查 pg_prepared_xacts

pg_current_snapshot () → pg_snapshot 返回当前 snapshot ,这是一个数据结构,显示哪些事务 ID 现正在进行中。此快照只包括顶级事务 ID;不显示子事务 ID;有关详细信息,请参阅 Section 74.3

pg_snapshot_xip ( pg_snapshot ) → setof xid8 返回快照中包含的正在进行中的事务 ID 集。

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 (subxid) 的正确答案;有关详细信息,请参阅 Section 74.3

内部事务 ID 类型 xid 是 32 位的,它在每 40 亿个事务后会回绕。但是, Table 9.80 中显示的函数使用一个 64 位类型 xid8 ,它在安装期间不会回绕,在需要时可通过强制转换将其转换为 xid ;有关详细信息,请参阅 Section 74.1 。数据类型 pg_snapshot 存储有关事务 ID 在特定时刻的可见性信息。其组件在 Table 9.81 中进行了描述。 pg_snapshot 的文本表示形式是 xmin:_xmax_:_xip_list_ 。例如, 10:20:10,14,15 表示 xmin=10, xmax=20, xip_list=10, 14, 15

Table 9.81. Snapshot Components

Name

Description

xmin

所有事务 ID 小于 xmin 的事务 ID 均已提交且可见或已回滚且已死亡。

xmax

大于或等于 xmax 的所有事务 ID 尚未在快照的时间完成,因此不可见。

xip_list

快照时间已进行中的事务。一个 xmin &#8656; _X < xmax_ 且不在此列表中的事务 ID 已在快照时间完成,因此根据其提交状态,它是可见或已死亡。此列表不包括子事务 (subxid) 的事务 ID。

在 13 之前的 PostgreSQL 版本中,没有 xid8 类型,因此提供了这些函数的变体,其中使用 bigint 来表示 64 位 XID,并具有相应的不同快照数据类型 txid_snapshot。这些较旧函数的名称中带有 txid。由于向后兼容性,它们仍然受支持,但可能会从未来版本中移除。请参阅 Table 9.82

Table 9.82. Deprecated Transaction ID and Snapshot Information Functions

Function

Description

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.26.9. Committed Transaction Information Functions #

Table 9.83 中所示函数提供有关以往事务提交时间的相关信息。它们仅当启用了 track_commit_timestamp 配置选项时才提供有用的数据,且仅针对在启用该选项后提交的事务提供。提交时间戳信息在真空过程中例行移除。

Table 9.83. Committed Transaction Information Functions

Function

Description

pg_xact_commit_timestamp ( xid ) → timestamp with time zone 返回事务的提交时间戳。

pg_xact_commit_timestamp_origin ( xid ) → record ( timestamp timestamp with time zone , roident oid )返回提交时间戳和事务复制原点。

pg_last_committed_xact () → record ( xid xid , timestamp timestamp with time zone , roident oid )返回最新已提交事务的事务 ID、提交时间戳和复制原点。

9.26.10. Control Data Functions #

Table 9.84 中显示的函数打印在 initdb 期间初始化的信息(例如目录版本)。它们还显示有关预写式日志记录和检查点处理的信息。此信息为群集范围,不特定于任何数据库。这些函数提供与 pg_controldata 应用程序相同信息来源的大部分相同信息。

Table 9.84. Control Data Functions

Function

Description

age ( xid ) → integer 返回提供的事务 ID 与当前事务计数器之间的事务数。

mxid_age ( xid ) → integer 返回提供的事务 ID 与当前多事务计数器之间的多事务 ID 数。

pg_control_checkpoint () → record 返回当前检查点状态的信息,如 Table 9.85 所示。

pg_control_system () → record 返回当前控制文件状态的信息,如 Table 9.86 所示。

pg_control_init () → record 返回群集初始化状态的信息,如 Table 9.87 所示。

pg_control_recovery () → record 返回恢复状态的信息,如 Table 9.88 所示。

Table 9.85. pg_control_checkpoint Output Columns

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

Table 9.86. pg_control_system Output Columns

Column Name

Data Type

pg_control_version

integer

catalog_version_no

integer

system_identifier

bigint

pg_control_last_modified

timestamp with time zone

Table 9.87. pg_control_init Output Columns

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

float8_pass_by_value

boolean

data_page_checksum_version

integer

Table 9.88. pg_control_recovery Output Columns

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