6.13. 杂项函数

Table 6-27 显示了 几个抽取会话及系统信息的函数。

Table 6-27. 会话信息函数

名字返回类型描述
current_database()name当前数据库的名字
current_schema()name当前模式的名字
current_schemas(boolean)name[]在搜索路径中的模式名字
current_username目前执行环境下的用户名
session_username会话用户名
username等于 current_user
version()textPostgreSQL 版本信息

session_user 是初始化数据库联接的用户,在该次联接过程 中固定. current_user 是用于权限检查的用户标识.通常, 它总是等于会话用户,但是在将来可能有 "setuid" 函数和其他 它是等于会话用户,但是它在函数执行的过程中随着属性 SECURITY DEFINER 的改变而改变. 在 Unix 的说法里,那么会话用户是"真实用户" 而当前用户是"有效用户"

废弃: current_usersession_user, 和 userSQL里有特殊的语意状态∶ 调用时结尾不要跟着园括号.

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

搜索路径可以通过运行时设置更改。所用地命令是 SET SEARCH_PATH 'schema'[,'schema']...

version() 返回一个描述 PostgreSQL服务器的版本的字串.

Table 6-28 显示可用的查询 以及变更运行时配置参数的函数。

Table 6-28. 配置设置信息函数

名字返回类型描述
current_setting(setting_name) text当前设置的值
set_config(setting_name, new_value, is_local) text当前设置的新数值

current_setting 用于以查询形式获取 setting_name 设置的当前数值。它和 SQL 命令 SHOW 是等效的。 比如:

select current_setting('DateStyle');
            current_setting
---------------------------------------
 ISO with US (NonEuropean) conventions
(1 row)

set_config 允许 setting_name 设置改变为 new_value。如果 is_local 设置为 true,那么新数值将只应用于当前事务。 如果你希望新的数值应用于当前事务,那么应该使用 false。 它等效于 SQL 命令 SET。比如:

select set_config('show_statement_stats','off','f');
 set_config
------------
 off
(1 row)

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

Table 6-29. 访问权限查询函数

名字返回类型描述
has_table_privilege(user, table, access) boolean用户是否有访问表的权限
has_table_privilege(table, access) boolean当前用户是否有访问表的权限
has_database_privilege(user, database, access) boolean用户是否有访问数据库的权限
has_database_privilege(database, access) boolean当前用户是否有访问数据库的权限
has_function_privilege(user, function, access) boolean用户是否有访问函数的权限
has_function_privilege(function, access) boolean当前用户是否有访问函数的权限
has_language_privilege(user, language, access) boolean用户是否有访问语言的权限
has_language_privilege(language, access) boolean当前用户是否有访问语言的权限
has_schema_privilege(user, schema, access) boolean用户是否有访问大纲的权限
has_schema_privilege(schema, access) boolean当前用户是否有访问大纲的权限

has_table_privilege 判断一个用户是否可以用某种 特定的方式访问一个表.该用户可以通过名字或者 ID (pg_user.usesysid) 来声明,如果省略该参数,则使用 current_user. 该表可以通过名字或者 OID 声明.(因此,实际上有六种 has_table_privilege 的变体,我们可以通过它们的参数数目 和类型来区分它们.) 如果用名字声明,那么在必要时该名字可以是模式修饰的. 所希望的访问类型是用一个文本字串来声明的,它们必须得出下面的几个 数值之一∶ SELECTINSERTUPDATEDELETERULEREFERENCES,或 TRIGGER.(当然,字串的大小写没什么关系.) 一个例子∶

SELECT has_table_privilege('myschema.mytable', 'select');

has_database_privilege 检查一个用户是否能以 特定方式访问一个数据库。它的可能参数类似 has_table_privilege。 需要的访问类型必须得出 CREATETEMPORARY, 或者 TEMP (它等效于 TEMPORARY)。

has_function_privilege 检查一个用户是否能以 特定方式访问一个函数。其可能参数类似 has_table_privilege。 我们声明一个函数用的是文本字串,儿不是 OID,允许的输入和 regprocedure 数据类型一样。当前可得的访问类型必须得出 EXECUTE

has_language_privilege 检查一个用户是否 可以以某种特定的方式访问一个过程语言。其可能参数类似 has_table_privilege。 当前可得的访问类型必须得出 USAGE

has_schema_privilege 检查一个用户是否 可以以某种特定的方式访问一个模式。其可能的参数类似 has_table_privilege。 当前可得的访问类型必须得出 CREATE 或者 USAGE

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Table 6-30. 模式可视性查询函数

名字返回类型描述
pg_table_is_visible(tableOID) boolean该表是否在搜索路径中可见
pg_type_is_visible(typeOID) boolean该类型是否在搜索路径中可见
pg_function_is_visible(functionOID) boolean该函数是否在搜索路径中可见
pg_operator_is_visible(operatorOID) boolean该操作符是否在搜索路径中可见
pg_opclass_is_visible(opclassOID) boolean该操作符表是否在搜索路径中可见

pg_table_is_visible 执行表检查(或者视图, 或者视任何其它类型的 pg_class 记录) pg_type_is_visiblepg_function_is_visiblepg_operator_is_visible,和 pg_opclass_is_visible 分别为类型,函数,操作符, 和操作符表执行同样的检查。对于函数和操作符,如果在搜索路径中没有同名 并且同样参数数据类型的对象出现在路径中靠前的位置,那么 该对象就是可见的。对于操作符表,则同时考虑名字和相关的索引访问方法。

所有这些函数都需要对象 OID 标识要检查的对象。如果你想通过名字测试一个对象, 那么使用 OID 别名类型 (regclassregtyperegprocedure, 或者 regoperator) 比较方便,比如

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

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

Table 6-31列出了从系统表中抽取信息的函数. pg_get_viewdef()pg_get_ruledef()pg_get_indexdef(),和pg_get_constraintdef() 分别从一个视图,规则,索引,或者约束 上重新构造创建它们的命令.(请注意这里是一个反编译的重新构造, 而不是该命令的原文.) 目前 pg_get_constraintdef() 只能处理外键约束。 pg_get_userbyid() 获取给出 的一个 usesysid 数值对应的用户名.

Table 6-31. 表信息函数

名字返回类型描述
pg_get_viewdef(viewname)text获取视图的CREATE VIEW命令(废弃了)
pg_get_viewdef(viewOID)text为视图获取CREATE VIEW命令
pg_get_ruledef(rulename)text为规则获取CREATE RULE命令
pg_get_indexdef(indexOID)text为索引获取CREATE INDEX命令
pg_get_userbyid(userid)name获取给出的 ID 的用户名

Table 6-32 显示的函数 将原来用 COMMENT 命令存储的评注抽取出来. 如果没有找到匹配声明的参数的评注,则返回 NULL

Table 6-32. 注释信息函数

名字返回类型描述
obj_description(objectOID, tablename)text获取一个数据库对象的评注
obj_description(objectOID)text获取一个数据库对象的评注(废弃)
col_description(tableOID, columnnumber)text获取一个表字段的评注

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

col_description() 返回一个表的字段的评注, 它是通过它的表和字段号的 OID 来声明的. 我们不能将 obj_description() 用于表字段, 因为字段没有自己的 OID.