9.19. 系统信息函数

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

Table 9-39. 会话信息函数

名字返回类型描述
current_database()name当前数据库的名字
current_schema()name当前模式的名字
current_schemas(boolean)name[]在搜索路径中的模式名字
current_username目前执行环境下的用户名
inet_client_addr()inet连接的远端址
inet_client_port()int连接的远端端口
inet_server_addr()inet连接的本地地址
inet_server_port()int连接的本地端口
session_username会话用户名
pg_postmaster_start_time()timestamp with time zonepostmaster 启动的时间
username等于 current_user
version()textPostgreSQL 版本信息

session_user 通常是初始化当前数据库联接的用户, 不过超级用户可以用 SET SESSION AUTHORIZATION 修改这个设置。 current_user 是用于权限检查的用户标识。通常, 它总是等于会话用户,但是在将来可能有 "setuid" 函数和其他它是等于会话用户, 但是它在函数执行的过程中随着属性 SECURITY DEFINER 的改变而改变。 在 Unix 的说法里,那么会话用户是"真实用户",而当前用户是"有效用户"

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

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 的变体,我们可以通过它们的参数数目和类型来区分它们。) 如果用名字声明,那么在必要时该名字可以是模式修饰的。 所希望的权限类型是用一个文本字串来声明的,它们必须得出下面的几个数值之一: 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 数据类型一样(参阅 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_visiblepg_function_is_visiblepg_operator_is_visiblepg_opclass_is_visible,和 pg_conversion_is_visible 分别为类型(和域),函数,操作符, ,操作符表和转换执行同样的检查。对于函数和操作符,如果在搜索路径中没有同名 并且同样参数数据类型的对象出现在路径中靠前的位置,那么 该对象就是可见的。对于操作符表,则同时考虑名字和相关的索引访问方法。

所有这些函数都需要对象 OID 标识要检查的对象。如果你想通过名字测试一个对象, 那么使用 OID 别名类型 (regclassregtyperegprocedure, 或者 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。