©
This document usesPHP Chinese website manualRelease
Table 9-47显示了几个提取会话及系统信息的函数
另外在本节所列出的函数,有一些函数有关统计系统,也提供系统信息。参阅Section 27.2.2获取更多信息。
Table 9-47. 会话信息函数
名称 | 返回类型 | 描述 |
---|---|---|
current_catalog |
name | 当前数据库名(在SQL标准里叫"catalog") |
current_database() |
name | 当前数据库名 |
current_schema [()] |
name | 当前模式名 |
current_schemas(boolean) |
name[] | 搜索路径中的模式名字,包括可选的隐式模式 |
current_user |
name | 当前执行环境下的用户名 |
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_user |
name | 会话用户名 |
user |
name | 等价于current_user |
version() |
text | PostgreSQL版本信息 |
Note:
current_catalog
,current_schema
,current_user
,session_user
和user
在SQL有特殊的语法: 调用他们后面必须不加括号。 (在 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 (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 | does user have privilege for foreign-data wrapper |
has_foreign_data_wrapper_privilege (fdw,privilege) |
boolean | does current user have privilege for foreign-data wrapper |
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_server_privilege (user,server,privilege) |
boolean | 指定用户是否有访问外部服务的权限 |
has_server_privilege (server,privilege) |
boolean | 当前用户是否有访问外部服务的权限 |
has_sequence_privilege (user,sequence,privilege) |
boolean | 指定用户是否有访问序列的权限 |
has_sequence_privilege (sequence,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 | 当前用户是否有访问该表空间的权限 |
pg_has_role (user,role,privilege) |
boolean | 指定用户是否有该角色的权限 |
pg_has_role (role,privilege) |
boolean | 当前用户是否有该角色的权限 |
has_table_privilege
检查用户是否可以用特定的方式访问表。 用户可以指定为名或OID(pg_authid.oid),或如果缺省该参数,则取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_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 ,允许的输入和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
。权限类型必须是CREATE或USAGE。
has_tablespace_privilege
检查一个用户是否能以特定方式访问一个表空间。 它可能的参数类似has_table_privilege
。权限类型必须是CREATE。
pg_has_role
检查一个用户是否能以特定方式访问一个角色。 它可能的参数类似has_table_privilege
。权限类型必须是MEMBER或USAGE。MEMBER表示是角色中的直接或间接成员关系(也就是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 别名 类型(regclass,regtype,regprocedure,regoperator,regconfig, orregdictionary)将会很方便。例如:
SELECT pg_type_is_visible('myschema.widget'::regtype);
请注意用这种方法测试一个未经修饰的名字没什么意义, 因为如果一个名字可以被识别,那它首先必须是可见的。
Table 9-50列出了从系统表中提取信息的函数
Table 9-50. 系统表信息函数
名称 | 返回类型 | 描述 |
---|---|---|
format_type(type_oid,typemod) |
text | 获取一个数据类型的 SQL 名称 |
pg_get_keywords() |
setof record | 获取SQL关键字和类别列表 |
pg_get_constraintdef(constraint_oid) |
text | 获取一个约束的定义 |
pg_get_constraintdef(constraint_oid,pretty_bool) |
text | 获取一个约束的定义 |
pg_get_expr(expr_text,relation_oid) |
text | 反编译一个表达式的内部形式,假设其中的任何 Var 都引用第二个参数指出的关系 |
pg_get_expr(expr_text,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_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 | 获取一个serial或bigserial字段使用的序列名 |
pg_get_triggerdef (trigger_oid) |
text | 为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令 |
pg_get_triggerdef (trigger_oid,pretty_bool) |
text | getCREATE [ CONSTRAINT ] TRIGGERcommand for 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_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_constraintdef
,pg_get_indexdef
,pg_get_ruledef
, 和pg_get_triggerdef
分别从一个视图、规则、索引、触发器、约束上重新构造创建它们的命令(反编译的 重新构造,而不是该命令的原文)。pg_get_expr
反编译一个独立表达式的内部形式, 比如一个字段的缺省值。在检查系统表的内容的时候很有用。pg_get_viewdef
重新构 造出定义视图的SELECT查询。这些函数大多数都有两个变种,其中一个是"适合打印" 的结果。这种格式更容易读,但是缺省的格式更有可能被将来的PostgreSQL版本用 同样的方法解释;如果是用于转储,那么尽可能避免使用"适合打印"的格式。 给 pretty-print参数传递false生成的结果和那个没有这个参数的变种生成的结果是完全一样。
pg_get_functiondef
returns a completeCREATE OR REPLACE FUNCTIONstatement for a function.pg_get_function_arguments
returns the argument list of a function, in the form it would need to appear in withinCREATE FUNCTION.pg_get_function_result
similarly returns the appropriateRETURNSclause for the function.pg_get_function_identity_arguments
returns 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
或许更为妥当, 因为它的当前名字反映了通常用serial或bigserial的列。)
pg_get_userbyid
extracts a role's name given its OID.pg_get_userbyid
通过角色OID获取对应的角色名。
pg_tablespace_databases
允许检查一个表空间的状况,它返回在该表空间中保存了对象的数据库 OID 集合。 如果这个函数返回数据行,那么该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,你需要把pg_tablespace_databases
返回的数据库标识 与pg_class表连接进行查询。
pg_typeof
returns 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_oid,column_number) |
text | 获取一个表字段注释 |
obj_description(object_oid,catalog_name) |
text | 获取一个数据库对象的注释 |
obj_description(object_oid) |
text | 获取一个数据库对象的注释(deprecated) |
shobj_description(object_oid,catalog_name) |
text | 获取一个共享数据库对象的注释 |
col_description
返回一个表中字段的注释,它是通过表 OID 和字段号来声明的。obj_description
不能用于表字段,因为字段没有自己的 OID 。
带有两个参数的obj_description
返回一个数据库对象的注释,该对象是通过其 OID 和其所属的系统表名字声明的。比如,obj_description(123456,'pg_class')将返回 OID 为 12345 的表的注释。只带一个参数的obj_description
只要求对象 OID ,现在已经废弃了, 因为我们不再保证 OID 在不同的系统表之间是唯一的,因此可能会返回错误的注释
shobj_description
和obj_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(bigint,txid_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。这个列表只包含在xmin和xmax之间的活动txids;有可能活动的txids高于xmax。 一个xmin <= txid |
txid_snapshot的文本表示为:xmin:xmax:xip_list。 例如10:20:10,14,15意思为:xmin=10, xmax=20, xip_list=10, 14, 15。