6.13. 杂项函数 #
表 6.27列出了多个用于提取会话和系统信息的函数。
表 6.27. 会话信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
current_database() | name | 当前数据库名称 |
current_schema() | name | 当前模式名称 |
current_schemas(boolean) | name[] | 搜索路径中的模式名称,可选地包含隐式模式 |
current_user | name | 当前执行上下文的用户名 |
session_user | name | 会话用户名 |
user | name | 等价于 current_user |
version() | text | PostgreSQL 版本信息 |
session_user 是发起数据库连接的用户;它在该连接期间是固定的。current_user
是适用于权限检查的用户标识符。通常它等于会话用户,但在执行带有 SECURITY DEFINER 属性的函数期间会发生变化。用 Unix 的说法,会话用户是“真实用户”,当前用户是“有效用户”。
注意
current_user、session_user和user在SQL中具有特殊的语法地位:调用它们时不得带尾随的圆括号。
current_schema 返回搜索路径最前面的模式的名称(如果搜索路径为空则返回空值)。这是创建任何未指定目标模式的表或其他命名对象时将使用的模式。current_schemas(boolean) 返回搜索路径中当前所有模式名称组成的数组。布尔选项决定返回的搜索路径中是否包含隐式包含的系统模式(如 pg_catalog)。
搜索路径可以通过运行时设置更改。要使用的命令是 SET SEARCH_PATH '
schema'[,'schema']...
version()返回一个描述PostgreSQL服务器版本的字符串。
表 6.28展示了那些可以用于查询以及修改运行时配置参数的函数。
表 6.28. 配置设置信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
current_setting(setting_name)
| text | 当前设置的值 |
set_config(
| 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)
表 6.29列出了允许用户以编程方式查询对象访问权限的函数。关于权限的更多信息,请参见第 2.7 节。
表 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 实际上有六种变体,可以通过参数的数量和类型区分。)按名称指定时,必要时名称可以带模式限定。所需的访问类型由一个文本字符串指定,它必须求值为
SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES 或
TRIGGER 之一。(但字符串的大小写无关紧要。)一个例子是:
SELECT has_table_privilege('myschema.mytable', 'select');
has_database_privilege 检查一个用户能否以某种特定方式访问一个数据库。其参数的可能形式与
has_table_privilege 类似。所需的访问类型必须求值为
CREATE、TEMPORARY 或
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。
表 6.30列出了判断某个特定对象是否可见的函数,其判断依据是当前模式搜索路径。例如,如果表所在的模式位于搜索路径中,并且在搜索路径的更前面没有同名表,就称该表可见。这等价于说,可以只通过表名引用该表,而不必显式地用模式限定。要列出所有可见表的名称:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 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_visible、pg_function_is_visible、pg_operator_is_visible 和
pg_opclass_is_visible 分别对类型、函数、操作符和操作符类执行相同的可见性检查。对于函数和操作符,如果在路径中更早的位置没有同名且参数数据类型相同的对象,则搜索路径中的对象是可见的。对于操作符类,名称和相关的索引访问方法都会被考虑。
所有这些函数都需要对象的 OID 来标识要检查的对象。如果想按名称测试一个对象,使用 OID 别名类型会很方便(regclass、regtype、regprocedure 或 regoperator),例如
SELECT pg_type_is_visible('myschema.widget'::regtype);注意,用这种方式测试一个未限定的名称没有多大意义—— 如果该名称根本能被识别出来,那它必然是可见的。
表 6.31列出了从系统目录中提取信息的函数。pg_get_viewdef()、pg_get_ruledef()、pg_get_indexdef() 和
pg_get_constraintdef() 分别重构造视图、规则、索引或约束的创建命令。(注意,这是反编译的重构造,不是该命令的逐字文本。)目前
pg_get_constraintdef() 只适用于外键约束。pg_get_userbyid()
根据一个 usesysid
值提取用户名。
表 6.31. 目录信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
pg_get_viewdef(viewname) | text | 获取视图的 CREATE VIEW 命令(已废弃) |
pg_get_viewdef(viewOID) | text | 获取视图的 CREATE VIEW 命令 |
pg_get_ruledef(ruleOID) | text | 获取规则的 CREATE RULE 命令 |
pg_get_indexdef(indexOID) | text | 获取索引的 CREATE INDEX 命令 |
pg_get_constraintdef(constraintOID) | text | 获取约束定义 |
pg_get_userbyid(userid) | name | 根据给定的 ID 获取用户名 |
表 6.32中所示的函数提取先前用 COMMENT 命令存储的注释。如果找不到与指定参数匹配的注释,则返回空值。
表 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 为 123456 的表的注释。obj_description() 的单参数形式只需要对象 OID。它现在已被废弃,因为无法保证
OID 在不同的系统目录中是唯一的;因此可能返回错误的注释。
col_description() 返回表列的注释,由其表的 OID 和列号指定。obj_description() 不能用于表列,因为列没有自己的 OID。