Table 9-39 显示了几个抽取会话及系统信息的函数。
Table 9-39. 会话信息函数
名字 | 返回类型 | 描述 |
---|---|---|
current_database () | name | 当前数据库的名字 |
current_schema () | name | 当前模式的名字 |
current_schemas (boolean) | name[] | 在搜索路径中的模式名字 |
current_user | name | 目前执行环境下的用户名 |
inet_client_addr () | inet | 连接的远端址 |
inet_client_port () | int | 连接的远端端口 |
inet_server_addr() | inet | 连接的本地地址 |
inet_server_port () | int | 连接的本地端口 |
session_user | name | 会话用户名 |
pg_postmaster_start_time () | timestamp with time zone | postmaster 启动的时间 |
user | name | 等于 current_user |
version () | text | PostgreSQL 版本信息 |
session_user
通常是初始化当前数据库联接的用户,
不过超级用户可以用
SET SESSION AUTHORIZATION 修改这个设置。
current_user
是用于权限检查的用户标识。通常,
它总是等于会话用户,但是在将来可能有 "setuid" 函数和其他它是等于会话用户,
但是它在函数执行的过程中随着属性
SECURITY DEFINER 的改变而改变。
在 Unix 的说法里,那么会话用户是"真实用户",而当前用户是"有效用户"。
注意:
current_user
,session_user
, 和user
在 SQL里有特殊的语意状态: 调用时结尾不要跟着园括号。
current_schema
返回在搜索路径前面的模式名字
(如果搜索路径是空则返回 NULL)。
如果创建表或者其它命名对象时没有声明目标模式,那么它将是用于这些对象的模式。
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_postmaster_start_time
返回 postmaster 启动时的
timestamp with time zone。
version
返回一个描述
PostgreSQL服务器的版本的字串。
Table 9-40 列出那些 允许用户在程序里查询对象访问权限的函数。 参阅 Section 5.6 获取更多有关权限的信息。
Table 9-40. 访问权限查询函数
名字 | 返回类型 | 描述 |
---|---|---|
has_table_privilege (user,
table,
privilege)
| boolean | 用户是否有访问表的权限 |
has_table_privilege (table,
privilege)
| boolean | 当前用户是否有访问表的权限 |
has_database_privilege (user,
database,
privilege)
| boolean | 用户是否有访问数据库的权限 |
has_database_privilege (database,
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_tablespace_privilege (user,
tablespace,
privilege)
| boolean | 用户是否有访问表空间的权限 |
has_tablespace_privilege (tablespace,
privilege)
| boolean | 当前用户是否有访问表空间的权限 |
has_table_privilege
判断一个用户是否可以用某种特定的方式访问一个表。
该用户可以通过名字或者 OID (pg_authid.oid)
来声明,如果省略该参数,则使用 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
数据类型一样(参阅 Section 8.12)。当前可得的访问权限类型必须得出 EXECUTE。
一个例子:
SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
has_language_privilege
检查一个用户是否可以以某种特定的方式访问一个过程语言。
其可能参数类似 has_table_privilege
。
可用的访问权限类型必须得出 USAGE。
has_tablespace_privilege
检查一个用户是否可以以特定方式访问一个表空间。
其可能参数类似 has_table_privilege
。用户需要的访问权限必须计算得出 CREATE。
has_schema_privilege
检查一个用户是否
可以以某种特定的方式访问一个模式。其可能的参数类似 has_table_privilege
。
当前可得的访问权限类型必须得出 CREATE 或者 USAGE。
要评估一个用户是否在权限上持有赋权选项,给权限键字附加 WITH GRANT OPTION;比如 'UPDATE WITH GRANT OPTION'。
Table 9-41 显示了那些判断一个对象是否在当前模式搜索路径中可见的函数。 如果一个表所在的模式在搜索路径中,并且没有同名的表出现在搜索路径的更早的地方,那么就说这个表视可见的。 它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的的名字:
SELECT relname from pg_class WHERE pg_table_is_visible(oid);
Table 9-41. 模式可视性查询函数
名字 | 返回类型 | 描述 |
---|---|---|
pg_table_is_visible (table_oid)
| boolean | 该表是否在搜索路径中可见 |
pg_type_is_visible (type_oid)
| boolean | 该类型是否在搜索路径中可见 |
pg_function_is_visible (function_oid)
| boolean | 该函数是否在搜索路径中可见 |
pg_operator_is_visible (operator_oid)
| boolean | 该操作符是否在搜索路径中可见 |
pg_opclass_is_visible (opclass_oid)
| boolean | 该操作符表是否在搜索路径中可见 |
pg_conversion_is_visible (conversion_oid)
| boolean | 转换是否在搜索路径中可见 |
pg_table_is_visible
执行表检查(或者视图,
或者视任何其它类型的 pg_class 记录)
pg_type_is_visible
,
pg_function_is_visible
,
pg_operator_is_visible
,
pg_opclass_is_visible
,和
pg_conversion_is_visible
分别为类型(和域),函数,操作符,
,操作符表和转换执行同样的检查。对于函数和操作符,如果在搜索路径中没有同名
并且同样参数数据类型的对象出现在路径中靠前的位置,那么
该对象就是可见的。对于操作符表,则同时考虑名字和相关的索引访问方法。
所有这些函数都需要对象 OID 标识要检查的对象。如果你想通过名字测试一个对象, 那么使用 OID 别名类型 (regclass,regtype,regprocedure, 或者 regoperator) 比较方便,比如
SELECT pg_type_is_visible('myschema.widget'::regtype);
请注意用这种方法测试一个未经修饰的名字没什么意义 — 如果一个名字可以被识别, 那它首先得是可见的。
Table 9-42. 系统表信息函数
名字 | 返回类型 | 描述 |
---|---|---|
format_type (type_oid, typemod) | text | 获取一个数据类型的 SQL 名称 |
pg_get_viewdef (view_name) | text | 获取视图的CREATE VIEW命令(废弃了) |
pg_get_viewdef (view_name, pretty_bool) | text | 获取视图的 CREATE VIEW (废弃了) |
pg_get_viewdef (view_oid) | text | 为视图获取CREATE VIEW命令 |
pg_get_viewdef (view_oid, pretty_bool) | text | 为视图获取CREATE VIEW命令 |
pg_get_ruledef (rule_oid) | text | 为规则获取CREATE RULE命令 |
pg_get_ruledef (rule_oid, pretty_bool) | text | 为规则获取CREATE RULE命令 |
pg_get_indexdef (index_oid) | text | 为索引获取CREATE INDEX命令 |
pg_get_indexdef (index_oid, column_no, pretty_bool) | text | 为索引获取 CREATE INDEX 命令, 如果 column_no 不为零,则是只获取一个索引字段的定义 |
pg_get_triggerdef (trigger_oid) | text | 为触发器获取 CREATE [ CONSTRAINT ] TRIGGER |
pg_get_constraintdef (constraint_oid) | text | 获取一个约束的定义 |
pg_get_constraintdef (constraint_oid, pretty_bool) | text | 获取一个约束的定义 |
pg_get_expr (expr_text, relation_oid) | text | 反编译一个表达式的内部形式,假设其中的任何 Vars 都引用第二个参数指出的关系 |
pg_get_expr (expr_text, relation_oid, pretty_bool) | text | 反编译一个表达式的内部形式,假设其中的任何 Vars 都引用第二个参数指出的关系 |
pg_get_userbyid (roleid) | name | 获取给出的 ID 的角色名 |
pg_get_serial_sequence (table_name, column_name) | text | 获取一个 serial 或者 bigserial 字段使用的序列名字 |
pg_tablespace_databases (tablespace_oid) | setof oid | 获取在指定表空间(OID表示)中拥有对象的一套数据库的 OID 的集合 |
format_type
通过某个数据类型的类型 OID 以及可能的类型修饰词返回其 SQL 名称。
如果不知道具体的修饰词,那么在类型修饰词的位置传入 NULL。
pg_get_viewdef()
,pg_get_ruledef()
,
pg_get_indexdef()
,pg_get_triggerdef
,和pg_get_constraintdef()
分别从一个视图,规则,索引,触发器或者约束上重新构造创建它们的命令。
(请注意这里是一个反编译的重新构造,而不是该命令的原文。)
pg_get_expr
反编译一个独立表达式的内部形式,
比如说一个字段的缺省值。在检查系统表的内容的时候很有用。
这些函数大多数都有两个变种,其中一个可以选择对结果的"漂亮的打印"。
漂亮打印的格式更容易读,但是缺省的格式更有可能被将来的 PostgreSQL
版本用同样的方法解释;如果是用于转储,那么尽可能避免使用漂亮打印。
给漂亮打印参数传递 false 生成的结果和那个没有这个参数的变种生成的结果完全一样。
pg_get_userbyid
抽取给出的一个角色 ID 号对应的用户名。
pg_get_serial_sequence
抓取与 serial 或者 bigserial
字段相关联的序列名字。
这个名字经过了合适的格式化,可以传递给序列函数(参阅 Section 9.12)。
如果字段没有附着序列,那么返回 NULL。
pg_tablespace_databases
允许我们检查一个表空间的使用状况。
它将返回一套数据库的 OID 集合,这些数据库都是在该表空间中保存有对象的数据库。
如果这个函数返回数据行,那么它就是非空的,因此不能删除。要显示填充了该表空间的特定对象,
你需要把 pg_tablespace_databases
标出的数据库标识与 pg_class 表连接进行查询。
在 Table 9-43 显示的函数 将原来用 COMMENT 命令存储的评注抽取出来。 如果没有找到匹配声明的参数的评注,则返回 NULL。
Table 9-43. 注释信息函数
名字 | 返回类型 | 描述 |
---|---|---|
obj_description (object_oid, catalog_name) | text | 获取一个数据库对象的评注 |
obj_description (object_oid) | text | 获取一个数据库对象的评注(废弃) |
col_description (table_oid, column_number) | text | 获取一个表字段的评注 |
两个参数形式的 obj_description
返回一个数据库对象的评注,
该对象是通过其 OID 和其包含系统表的名字声明的。
比如,obj_description(123456,'pg_class') 将返回 OID
为 12345 的表的评注。一个参数的 obj_description
只要求对象 OID。它现在已经废弃了,因为我们不再保证 OID 在不同的系统表之间是唯一的;因此可能会返回错误的评注。
col_description
返回一个表的字段的评注,
它是通过它的表和字段号的 OID 来声明的。
我们不能将 obj_description
用于表字段,
因为字段没有自己的 OID。