9.23. 系统信息函数

Table 9-47显示了几个提取会话及系统信息的函数

另外在本节所列出的函数,有一些函数有关统计系统,也提供系统信息。参阅Section 27.2.2获取更多信息。

Table 9-47. 会话信息函数

名称返回类型描述
current_catalogname当前数据库名(在SQL标准里叫"catalog"
current_database()name当前数据库名
current_schema[()]name当前模式名
current_schemas(boolean)name[]搜索路径中的模式名字,包括可选的隐式模式
current_username当前执行环境下的用户名
current_query()text执行当前的文本查询,由客户端提交(可能包含多于1句)
pg_backend_pid()int 连接到当前会话的服务器进程 ID
pg_listening_channels()setof text正在侦听的当前会话的信道名称
inet_client_addr()inet连接的远端地址
inet_client_port()int连接的远端端口
inet_server_addr()inet连接的本地地址
inet_server_port()int连接的本地端口
pg_my_temp_schema()oid会话的临时模式的OID ,不存在则为 0
pg_is_other_temp_schema(oid)boolean是否为另一个会话的临时模式?
pg_postmaster_start_time()timestamp with time zone服务器启动时间
pg_conf_load_time()timestamp with time zone配置加载时间
session_username会话用户名
username等价于current_user
version()textPostgreSQL版本信息

Note: current_catalogcurrent_schemacurrent_usersession_useruserSQL有特殊的语法: 调用他们后面必须不加括号。 (在 PostgreSQL,current_schema括号是可选的,但是其它的不是。)

session_user通常是连接当前数据库的初始用户,不过超级用户可以 用 SET SESSION AUTHORIZATION 修改这个设置。current_user是用于权限 检查的用户标识。通常,它总是等于会话用户,但是可以通过SET ROLE改变它。 在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 用 Unix 术语来说,会话用户是"真实用户"real user"",而当前用户是"有效用户"effective user""。

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

Note: 搜索路径可以通过运行时设置更改。命令是:

SET search_path TOschema[schema, ...]

pg_listening_channels返回当前会话正在监听的一组信道名称。见LISTEN获取更多信息。

inet_client_addr返回当前客户端的IP地址,而inet_client_port则 返回当前客户端的端口号。inet_server_addr返回服务器接收当前连接用的 IP 地址,而inet_server_port返回接收当前连接的端口号。 如果是通过 Unix-domain socket 连接的,那么所有这些函数都返回 NULL 。

pg_my_temp_schema返回当前会话的临时模式 OID ,如果不存在的话则 返回 0(因为没有创建任何临时表)。pg_is_other_temp_schema返回给定 的 OID 是否为其它会话的临时模式 OID , 这个函数是有实用价值的,比如,在显示一个目录的时候排除掉其它会话的临时表

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

pg_conf_load_time返回最后载服务器配置文件的时间戳。 (如果当前会话时还活着,将是当前会话本身重新读取配置文件的时间,所以读取的时间会在不同的会话中稍微有所不同。 否则,它是postmaster进程重新读取配置文件的时间。)

version返回一个描述PostgreSQL服务器版本信息的字符串。

Table 9-48列出那些允许用户在程序里查询 对象访问权限的函数。参阅Section 5.6获取更多有关权限的信息

Table 9-48. 访问权限查询函数

名称返回类型描述
has_any_column_privilege(usertableprivilege) boolean指定用户有没有访问表任何列的权限
has_any_column_privilege(tableprivilege) boolean当前用户有没有访问表任何列的权限
has_column_privilege(usertablecolumnprivilege) boolean指定用户有没有访问列的权限
has_column_privilege(tablecolumnprivilege) boolean当前用户有没有访问列的权限
has_database_privilege(userdatabaseprivilege) boolean指定用户是否有访问数据库的权限
has_database_privilege(databaseprivilege) boolean当前用户是否有访问数据库的权限
has_foreign_data_wrapper_privilege(userfdwprivilege) booleandoes user have privilege for foreign-data wrapper
has_foreign_data_wrapper_privilege(fdwprivilege) booleandoes current user have privilege for foreign-data wrapper
has_function_privilege(userfunctionprivilege) boolean指定用户是否有访问函数的权限
has_function_privilege(functionprivilege) boolean当前用户是否有访问函数的权限
has_language_privilege(userlanguageprivilege) boolean指定用户是否有访问语言的权限
has_language_privilege(languageprivilege) boolean当前用户是否有访问语言的权限
has_schema_privilege(userschemaprivilege) boolean指定用户是否有访问模式的权限
has_schema_privilege(schemaprivilege) boolean当前用户是否有访问模式的权限
has_server_privilege(userserverprivilege) boolean指定用户是否有访问外部服务的权限
has_server_privilege(serverprivilege) boolean当前用户是否有访问外部服务的权限
has_sequence_privilege(usersequenceprivilege) boolean指定用户是否有访问序列的权限
has_sequence_privilege(sequenceprivilege) boolean当前用户是否有访问序列的权限
has_table_privilege(usertableprivilege) boolean用户是否有访问表的权限
has_table_privilege(tableprivilege) boolean当前用户是否有访问表的权限
has_tablespace_privilege(usertablespaceprivilege) boolean指定用户是否有访问表空间的权限
has_tablespace_privilege(tablespaceprivilege) boolean当前用户是否有访问该表空间的权限
pg_has_role(userroleprivilege) boolean指定用户是否有该角色的权限
pg_has_role(roleprivilege) boolean当前用户是否有该角色的权限

has_table_privilege检查用户是否可以用特定的方式访问表。 用户可以指定为名或OID(pg_authid.oid),或如果缺省该参数,则取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类似。 想要的访问权限必须为USAGESELECT,或UPDATE

has_any_column_privilege检查用户是否可以用特定的方式访问表的任何列。 其参数可能与has_table_privilege类似,除了想要的权限类型必须是SELECTINSERTUPDATE, 或REFERENCES的一些值组合。 请注意,在表级别隐含任何这些特权授予它为每个表列,因此如果与has_table_privilege参数相同, has_any_column_privilege总是返回true。但是如果有至少一列的列级权限授予也成功。

has_column_privilege检查用户是否可以用特定的方式访问一列。 其可能的参数类似于has_table_privilege,带有额外的指定列,其要么为列名或列号。 想要的权限类型必须是SELECTINSERTUPDATE, 或REFERENCES的一些值组合。 请注意,在表级别隐含任何这些特权授予它为每个表列。

has_database_privilege检查一个用户是否能以特定方式访问一个数据库。 它可能的参数类似has_table_privilege。 权限类型必须是CREATECONNECTTEMPORARYTEMP(等价于TEMPORARY)之一。

has_function_privilege检查一个用户是否能以特定方式访问一个函数。 它可能的参数类似has_table_privilege。我们声明一个函数用的是文本字符 串而不是 OID ,允许的输入和regprocedure 数据类型一样(参阅Section 8.16)。权限类型必须是EXECUTE。 一个例子如下:

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_language_privilege检查一个用户是否能以特定方式访问一个过程语言。 它可能的参数类似has_table_privilege。权限类型必须是USAGE

has_schema_privilege检查一个用户是否能以特定方式访问一个模式。 它可能的参数类似has_table_privilege。权限类型必须是CREATEUSAGE

has_tablespace_privilege检查一个用户是否能以特定方式访问一个表空间。 它可能的参数类似has_table_privilege。权限类型必须是CREATE

pg_has_role检查一个用户是否能以特定方式访问一个角色。 它可能的参数类似has_table_privilege。权限类型必须是MEMBERUSAGEMEMBER表示是角色中的直接或间接成员关系(也就是SET ROLE的权限), 而USAGE表示角色的权限是否无需SET ROLE即可立即生效。

Table 9-49显示了那些判断一个对象是否在当前模式搜索路径中可见的函数。 如果一个表所在的模式在搜索路径中,并且没有同名的表出现在搜索路径的 更靠前的地方,那么就说这个表是可见的。 它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名字:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Table 9-49. 模式可见性查询函数

名称返回类型描述
pg_conversion_is_visible(conversion_oid) boolean该转换是否在搜索路径中可见
pg_function_is_visible(function_oid) boolean该函数是否在搜索路径中可见
pg_operator_is_visible(operator_oid) boolean该操作符是否在搜索路径中可见
pg_opclass_is_visible(opclass_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 别名 类型(regclassregtyperegprocedureregoperatorregconfig, orregdictionary)将会很方便。例如:

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

请注意用这种方法测试一个未经修饰的名字没什么意义, 因为如果一个名字可以被识别,那它首先必须是可见的。

Table 9-50列出了从系统表中提取信息的函数

Table 9-50. 系统表信息函数

名称返回类型描述
format_type(type_oidtypemod)text获取一个数据类型的 SQL 名称
pg_get_keywords()setof record获取SQL关键字和类别列表
pg_get_constraintdef(constraint_oid)text获取一个约束的定义
pg_get_constraintdef(constraint_oidpretty_bool)text获取一个约束的定义
pg_get_expr(expr_textrelation_oid)text 反编译一个表达式的内部形式,假设其中的任何 Var 都引用第二个参数指出的关系
pg_get_expr(expr_textrelation_oidpretty_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_oidcolumn_nopretty_bool)text 获取索引的CREATE INDEX命令,如果column_no不为零,则只获取一个索引字段的定义。
pg_get_ruledef(rule_oid)text为规则获取CREATE RULE命令
pg_get_ruledef(rule_oidpretty_bool)text为规则获取CREATE RULE命令
pg_get_serial_sequence(table_namecolumn_name)text 获取一个serialbigserial字段使用的序列名
pg_get_triggerdef(trigger_oid)text 为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令
pg_get_triggerdef(trigger_oidpretty_bool)textgetCREATE [ CONSTRAINT ] TRIGGERcommand for trigger
pg_get_userbyid(role_oid)name获取给定 OID 的角色名
pg_get_viewdef(view_name)text为视图获取底层的SELECT命令(已废弃)
pg_get_viewdef(view_namepretty_bool)text为视图获取底层的SELECT命令(已废弃)
pg_get_viewdef(view_oid)text为视图获取底层的SELECT命令
pg_get_viewdef(view_oidpretty_bool)text为视图获取底层的SELECT命令
pg_tablespace_databases(tablespace_oid)setof oid获取在指定的表空间有对象的数据库 OID 集合
pg_typeof(any)regtype获取任何值的数据类型

format_type通过某个数据类型的类型 OID 以及可能的类型修饰词返回其 SQL 名称。 如果不知道具体的修饰词,那么在类型修饰词的位置传入 NULL。

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

pg_get_constraintdefpg_get_indexdefpg_get_ruledef, 和pg_get_triggerdef 分别从一个视图、规则、索引、触发器、约束上重新构造创建它们的命令(反编译的 重新构造,而不是该命令的原文)。pg_get_expr反编译一个独立表达式的内部形式, 比如一个字段的缺省值。在检查系统表的内容的时候很有用。pg_get_viewdef重新构 造出定义视图的SELECT查询。这些函数大多数都有两个变种,其中一个是"适合打印" 的结果。这种格式更容易读,但是缺省的格式更有可能被将来的PostgreSQL版本用 同样的方法解释;如果是用于转储,那么尽可能避免使用"适合打印"的格式。 给 pretty-print参数传递false生成的结果和那个没有这个参数的变种生成的结果是完全一样。

pg_get_functiondefreturns a complete CREATE OR REPLACE FUNCTIONstatement for a function. pg_get_function_argumentsreturns the argument list of a function, in the form it would need to appear in within CREATE FUNCTION. pg_get_function_resultsimilarly returns the appropriateRETURNSclause for the function. pg_get_function_identity_argumentsreturns the argument list necessary to identify a function, in the form it would need to appear in withinALTER FUNCTION, for instance. This form omits default values.

pg_get_serial_sequence返回与一个字段相关的序列名;如果没有 任何序列与给定的字段相关则返回 NULL 。第一个输入参数是可选模式的表名,第二个参数是列名。 因为第一个参数可能是一个模式和表,它不是视为一个双引号的标识符,意味着默认情况下小写, 而第二个参数只是列名称,被视为为双引号,并保留其大小写。 该函数返回适当格式化的值传递给序列函数(参阅Section 9.15)。 这种相关性可以通过ALTER SEQUENCE OWNED BY修改或删除。 (其实调用这个函数pg_get_owned_sequence或许更为妥当, 因为它的当前名字反映了通常用serialbigserial的列。)

pg_get_userbyidextracts a role's name given its OID. pg_get_userbyid通过角色OID获取对应的角色名。

pg_tablespace_databases允许检查一个表空间的状况,它返回在该表空间中保存了对象的数据库 OID 集合。 如果这个函数返回数据行,那么该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,你需要把pg_tablespace_databases返回的数据库标识 与pg_class表连接进行查询。

pg_typeofreturns the OID of the data type of the value that is passed to it. This can be helpful for troubleshooting or dynamically constructing SQL queries. The function is declared as returningregtype, which is an OID alias type (see Section 8.16); this means that it is the same as an OID for comparison purposes but displays as a type name. For example:

SELECT pg_typeof(33);

 pg_typeof 
-----------
 integer
(1 row)

SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
 typlen 
--------
      4
(1 row)

Table 9-51显示的函数将原来用 COMMENT命令存储的注释抽取出来。如果没有找到,则返回 NULL

Table 9-51. 注释信息函数

名称返回类型描述
col_description(table_oidcolumn_number)text获取一个表字段注释
obj_description(object_oidcatalog_name)text获取一个数据库对象的注释
obj_description(object_oid)text获取一个数据库对象的注释(deprecated
shobj_description(object_oidcatalog_name)text获取一个共享数据库对象的注释

col_description返回一个表中字段的注释,它是通过表 OID 和字段号来声明的。 obj_description不能用于表字段,因为字段没有自己的 OID 。

带有两个参数的obj_description返回一个数据库对象的注释,该对象是通过其 OID 和其所属的系统表名字声明的。比如,obj_description(123456,'pg_class') 将返回 OID 为 12345 的表的注释。只带一个参数的obj_description只要求对象 OID ,现在已经废弃了, 因为我们不再保证 OID 在不同的系统表之间是唯一的,因此可能会返回错误的注释

shobj_descriptionobj_description差不多,不同之处仅在于前者用于共享对象。 一些系统表是通用于集群中所有数据库的全局表,因此这些表的描述也是全局存储的

The functions shown inTable 9-52 provide server transaction information in an exportable form. The main use of these functions is to determine which transactions were committed between two snapshots.

Table 9-52. 事务ID和快照

名称返回类型描述
txid_current()bigint获取当前事务 ID
txid_current_snapshot()txid_snapshot获取当前快照
txid_snapshot_xmin(txid_snapshot)bigint获取快照的xmin
txid_snapshot_xmax(txid_snapshot)bigint获取快照的xmax
txid_snapshot_xip(txid_snapshot)setof bigint获取在快照的进行中的事务IDs
txid_visible_in_snapshot(biginttxid_snapshot)boolean在快照事务ID是否可见?(不使用子事务ID)

内部事务 ID 类型(xid)是32位,每40亿事务循环。 尽管这些函数导出一个64位格式,一个"epoch"计数器扩展,所以在安装过程中不会循环。 这些函数使用的数据类型txid_snapshot,存储在某时刻可见的关于事物ID的信息。其组件描述在Table 9-53

Table 9-53. 快照构成

名称描述
xmin 最早的事务ID(txid)仍然活动。所有较早事务将是可见提交了,或者要么死掉回滚了。
xmax 首先作为尚未分配的txid。所有大于或等于此的txids作为这时的快照都是尚未开始的,因此不可见。
xip_list 在快照的时间的活动txids。这个列表只包含在xminxmax之间的活动txids;有可能活动的txids高于xmax。 一个xmin <= txid <xmax的txid,不在这个列表中,在快照的这个时间已经是完成的, 因此要么可见或死掉对应它的提交状态。这个列表不包含子事务的txids。

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