9.25. 系统信息函数

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

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

表 9.60. 会话信息函数

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

注意

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

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

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

注意

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

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

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

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

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

pg_current_logfiletext 的形式返回日志采集器当前使用的日志文件的路径。路径包括 log_directory目录和日志文件名。 必须启用日志收集或返回值为NULL。当存在多个日志文件时, 每个格式都不同,调用时不带参数的pg_current_logfile 将返回具有在有序列表中找到的第一个格式的文件的路径:stderrcsvlog。当没有日志文件具有任何这些格式时, 将返回NULL。要以text的形式请求特定的文件格式, 可以使用csvlogstderr作为可选参数的值。 当请求的日志格式不是配置的log_destination时, 返回值是NULLpg_current_logfiles 反映了current_logfiles文件的内容。

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

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

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

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

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

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

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

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

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

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

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

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

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

row_security_active检查行级安全是否对 current_user以及环境上下文中的指定表是活跃的。 通过名称或者OID指定表。

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

表 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_type_is_visible也可以被用于域。对于函数和操作符, 如果在路径中更早的地方没有出现具有相同名称和参数数据类型的对象, 该对象在搜索路径中是可见的。对于操作符类,名称和相关的索引访问方法都要考虑。

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

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

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

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

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

pg_get_functiondef为一个函数返回一个完整的CREATE OR REPLACE FUNCTION语句。pg_get_function_arguments返回一个函数的参数列表,形式按照它们出现在CREATE FUNCTION中的那样。pg_get_function_result类似地返回函数的合适的RETURNS子句。pg_get_function_identity_arguments返回标识一个函数必要的参数列表,形式和它们出现在ALTER FUNCTION中的一样。这种形式忽略默认值。

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

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

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

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

表 9.64.  索引列属性

名称描述
asc在向前扫描时列是按照升序排列吗?
desc在向前扫描时列是按照降序排列吗?
nulls_first在向前扫描时列排序会把空值排在前面吗?
nulls_last在向前扫描时列排序会把空值排在最后吗?
orderable列具有已定义的排序顺序吗?
distance_orderable列能否通过一个distance操作符 (例如ORDER BY col <-> constant)有序地扫描?
returnable列值是否可以通过一次只用索引扫描返回?
search_array列是否天然支持col = ANY(array)搜索?
search_nulls列是否支持IS NULLIS NOT NULL搜索?

表 9.65. 索引性质

名称描述
clusterable索引是否可以用于CLUSTER命令?
index_scan索引是否支持普通扫描(非位图)?
bitmap_scan索引是否支持位图扫描?
backward_scan索引是否可以反向扫描?

表 9.66. 索引访问方法性质

名称描述
can_order访问方法是否支持ASCDESC 以及CREATE INDEX中的有关关键词?
can_unique访问方法是否支持唯一索引?
can_multi_col访问方法是否支持多列索引?
can_exclude访问方法是否支持排除约束?

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

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

pg_typeof返回传递给它的值的数据类型的 OID。这在检修或者动态构建 SQL 查询时有用。函数被声明为返回regtype,它是一个 OID 别名类型(见第 8.18 节);这表明它和一个用于比较目的的 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_regnamespace以及to_regrole 函数各自转换关系,函数,操作符,类型,模式以及角色名称为 regclassregprocregprocedureregoperregoperatorregtyperegnamespace以及regrole类型对象。 这些函数不同于来自不接受数字OID的文本映射,并返回空而不是抛出一个错误。 如果没有找到名称(或to_regprocto_regoper, 如果给定的名称匹配多个对象)。

表 9.67列出与数据库对象标识和寻址有关的函数。

表 9.67. 对象信息和地址函数

名称返回类型描述
pg_describe_object(catalog_id, object_id, object_sub_id)text获取数据库对象的描述
pg_identify_object(catalog_id oid, object_id oid, object_sub_id integer)type text, schema text, name text, identity text获取数据库对象标识
pg_identify_object_as_address(catalog_id oid, object_id oid, object_sub_id integer)type text, name text[], args text[]获取数据库对象地址的外部表征
pg_get_object_address(type text, name text[], args text[])catalog_id oid, object_id oid, object_sub_id int32从外部表征中获取数据库对象地址

pg_describe_object返回一个数据库对象的文本描述, 该数据库对象由目录 OID、对象 OID 和一个(可能为零)子对象 ID 指定。 这个描述会是人类可读的,并且可能是被翻译过的,具体情况取决于服务器配置。 这在判断存储在pg_depend目录中的一个对象的身份有用。

pg_identify_object返回一行, 其中包含足够的信息来唯一地标识数据库对象, 该数据库对象由目录 OID、对象 OID 和一个(可能为零)子对象 ID 指定。 这个信息是机器可读的,并且永远不会被翻译。type标识数据库对象的类型; schema是对象所属的模式的名称, 如果对象类型不属于模式则为NULLname是对象的名称,必要时要加上引号, 只在能被用作对象的唯一标识符时出现(和模式名称一起,如果相关), 否则为NULLidentity是完整的对象身份, 确切格式取决于对象类型,并且格式中的每一部分都是模式限定的并且按照需要被加上了引号。

pg_identify_object_as_address返回一行, 其中包含足够的信息来唯一地标识数据库对象, 该数据库对象由目录 OID、对象 OID 和一个(可能为零)子对象 ID 指定。 返回的信息是独立于当前服务器的,也就是说, 它可以用于标识另一个服务器中同一个命名对象。 type标识数据库对象的类型; nameargs是形成对象引用的文本数组。 传递三列到pg_get_object_address获取对象的外部地址。 这个函数是pg_get_object_address的逆函数。

pg_get_object_address返回行, 包含足够信息来唯一地标识数据库对象,该数据库对象由类型和对象名称以及参数数组指定。 返回值是在系统目录中使用的比如pg_depend,并且可以传递给其它系统函数 比如pg_identify_object或者pg_describe_objectcatalog_id是包含对象的系统目录OID; object_id是对象本身的OID,object_sub_id是对象的子ID, 如果没有则为零。这个函数是pg_identify_object_as_address的逆函数。

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

表 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 和它的列号指定(obj_description不能被用在表列,因为表列没有自己的 OID)。

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

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

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

表 9.69. 事务 ID 和快照

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

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

表 9.70. 快照成分

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

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

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

表 9.71中显示的函数 提供了已提交事务的信息。这些函数主要提供关于事务提交的信息。 当track_commit_timestamp配置选项启用的时候, 并且只有启用后提交的事务,它们只提供有用的数据。

表 9.71. 已提交事务信息

名称返回类型描述
pg_xact_commit_timestamp(xid) timestamp with time zone事务提交的时间戳
pg_last_committed_xact() xid xid, timestamp timestamp with time zone最近提交事务的事务ID以及提交时间戳

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

表 9.72. Control Data Functions

名称返回类型描述
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_lsnpg_lsn
prior_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返回一个 表 9.74中所示的记录。

表 9.74. pg_control_system

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

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

表 9.75. pg_control_init

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

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

表 9.76. pg_control_recovery

列名数据类型
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean