↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0
历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.

9.19. 系统信息函数 #

表 9.39列出了多个用于提取会话和系统信息的函数。

表 9.39. 会话信息函数

NameReturn Type描述
current_database()name当前数据库名
current_schema()name当前模式名
current_schemas(boolean)name[]搜索路径中的模式名,可选地包括隐式模式
current_username当前执行上下文的用户名
inet_client_addr()inet远端连接地址
inet_client_port()int4远端连接端口
inet_server_addr()inet本地连接地址
inet_server_port()int4本地连接端口
session_username会话用户名
username等价于 current_user
version()textPostgreSQL 版本信息

session_user通常是发起当前数据库连接的用户;但超级用户可以用SET SESSION AUTHORIZATION更改这一设置。current_user是适用于权限检查的用户标识符。通常它等于会话用户,但在执行带有SECURITY DEFINER属性的函数期间会改变。用 Unix 的话说,会话用户是“真实用户”,而当前用户是“有效用户”。

注意

current_user、session_user和user在SQL中具有特殊的语法地位:调用它们时不得带尾随的圆括号。

current_schema 返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回空值)。在创建表或其他命名对象时,如果未指定目标模式,就会使用该模式。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。

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

表 9.40列出了一些函数,它们允许用户通过编程方式查询对象访问权限。关于权限的更多信息,请参见第 5.7 节。

表 9.40. 访问权限查询函数

NameReturn Type描述
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检查用户是否可以以某种方式访问表。用户可以通过名称或 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数据类型相同(参见第 8.12 节)。所需访问权限类型必须为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。

要测试用户是否持有某个权限的转授选项,可以在权限关键字后加上 WITH GRANT OPTION;例如'UPDATE WITH GRANT OPTION'。

表 9.41列出了判断某个特定对象是否可见的函数,其判断依据是当前模式搜索路径。例如,如果表所在的模式位于搜索路径中,并且在搜索路径的更前面没有同名表,就称该表可见。这等价于说,可以只通过表名引用该表,而不必显式地用模式限定。要列出所有可见表的名称:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

表 9.41. 模式可见性查询函数

NameReturn Type描述
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);

注意,以这种方式测试一个不带模式限定的名称没有多大意义——如果该名称能够被识别,它必然是可见的。

表 9.42列出从系统目录中提取信息的函数。

表 9.42. 系统目录信息函数

NameReturn Type描述
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反编译表达式的内部形式,假定其中所有 Var 节点都引用第二个参数指定的关系
pg_get_expr(expr_text, relation_oid, pretty_bool)text反编译表达式的内部形式,假定其中所有 Var 节点都引用第二个参数指定的关系
pg_get_userbyid(userid)name获取具有给定 ID 的用户名
pg_get_serial_sequence(table_name, column_name)text获取serial或bigserial列所使用的序列的名称
pg_tablespace_databases(tablespace_oid)setof 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 列关联的序列的名称。该名称的格式适合传递给序列函数(见第 9.12 节)。如果该列没有关联的序列,则返回 NULL。

pg_tablespace_databases允许检查表空间的使用情况。它返回在该表空间中存有对象的数据库的 OID 集合。如果这个函数返回了任何行,则该表空间非空,不能被删除。要显示占用该表空间的具体对象,你需要连接到pg_tablespace_databases标识出的各个数据库,并查询它们的pg_class目录。

表 9.43中的函数用于提取此前通过COMMENT命令存储的注释。如果找不到与指定参数对应的注释,则返回空值。

表 9.43. 注释信息函数

NameReturn Type描述
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 为 123456 的表的注释。obj_description 的单参数形式只需要对象 OID。该形式已被弃用,因为无法保证 OID 在不同系统目录之间唯一,因而可能返回错误的注释。

col_description返回表列的注释,列由所属表的 OID 和列号指定。由于列本身没有各自的 OID,obj_description不能用于表列。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.