PostgreSQL教程(三十九):客户端接口(三)之 信息模式

信息模式由一组视图构成,它们包含定义在当前数据库中对象的信息。信息模式以 SQL 标准定义,因此能够被移植并且保持稳定 — 系统目录则不同,它们是与PostgreSQL相关的并且是为了实现的考虑而建模的。不过,信息模式视图不包含与PostgreSQL-相关特性有关的信息。要咨询那些信息你需要查询系统目录或其他PostgreSQL-相关视图。

注意:

当在数据库中查询约束信息时,一个期望返回一行的标准兼容的查询可能返回多行。这是因为 SQL 标准要求约束名在一个模式中唯一,但是PostgreSQL并不强制这种限制。PostgreSQL自动产生的约束名避免在相同的模式中重复,但是用户能够指定这种重复的名称。

这个问题可能在查询信息模式视图时出现,例如check_constraint_routine_usage、 check_constraintsdomain_constraints和 referential_constraints。一些其他视图也有相似的问题,但是它们包含了表名来帮助区分重复行,例如constraint_column_usage、 constraint_table_usagetable_constraints

一、模式

信息模式本身是一个名为information_schema的模式。这个模式自动存在于所有数据库中。这个模式的拥有者是集簇中的初始数据库用户,并且该用户自然地拥有这个模式上的所有特权,包括删除它的能力(但是这样节省的空间是很小的)。

默认情况下,信息模式不在模式搜索路径中,因此你需要使用限定名访问其中的所有对象。因为信息模式中的某些对象的名称是可能出现在用户应用中的一般名称,如果你想把该信息模式放在路径中,你应该小心。

二、数据类型

信息模式视图的列使用定义在信息模式中的特殊数据类型。它们被定义为普通内建类型之上的简单域。你不应在信息模式之外使用这些类型进行工作,但是如果你的应用从信息模式中进行选择,那你的应用就必须准备好面对它们。

这些类型是:

cardinal_number

        一种非负整数。

character_data

        一种字符串(没有指定最大长度)。

sql_identifier

        一种字符串。这种类型被用于 SQL 标识符,类型character_data被用于任何其他类型的文本数据。

time_stamp

        在类型timestamp with time zone之上的一个域。

yes_or_no

        一种字符串域,它包含YESNO。这被用来在信息模式中表示布尔(真/假)(信息模式是在类型boolean被加到 SQL 标准之前被发明的,因此这个惯例是用来使信息模式向后兼容)。

信息模式中的每一列都是这五种类型之一。

三、information_schema_catalog_name

    information_schema_catalog_name是一个表,它总是包含一行和一列,其中包含了当前数据库(SQL 术语中的当前目录)的名字。

表 3.1. information_schema_catalog_name

名称 数据类型 描述
catalog_name sql_identifier 包含这个信息模式的数据库名

四、administrable_role_authorizations

        视图administrable_role_authorizations标识当前用户对其有管理选项的所有角色。

表 3.2. administrable_role_authorizations

名称 数据类型 描述
grantee sql_identifier 被授予这个角色的成员关系的角色名(可以是当前用户,或者在嵌套角色成员关系情况下的一个不同角色)
role_name sql_identifier 角色名
is_grantable yes_or_no 总是 YES

五、applicable_roles

        视图applicable_roles当前用户可以使用其特权的所有角色。这意味着有某种角色授权链从当前用户到讨论中的角色。当前用户本身也是一个可应用的角色。可应用的角色的集合通常被用于权限检查。

表 3.3. applicable_roles

名称 数据类型 描述
grantee sql_identifier 被授予这个角色的成员关系的角色名(可以是当前用户,或者在嵌套角色成员关系情况下的一个不同角色)
role_name sql_identifier 一个角色的名字
is_grantable yes_or_no YES表示被授予者在该角色上有管理选项,NO表示没有管理选项

六、attributes

        视图attributes包含数据库中定义的组合数据类型的属性的有关信息(注意该视图并不给出有关表列的信息,表列有时候在 PostgreSQL 上下文环境中也被称为属性)。只有当前用户能够访问(由于是拥有者获得的权限或是在类型上有某些特权)的那些属性会被显示。

表 3.4. attributes

名称 数据类型 描述
udt_catalog sql_identifier 包含该数据类型的数据库名(总是当前数据库)
udt_schema sql_identifier 包含该数据类型的模式名
udt_name sql_identifier 数据类型名
attribute_name sql_identifier 属性名
ordinal_position cardinal_number 属性在该数据类型内部的顺序位置(从 1 开始计算)
attribute_default character_data 该属性的默认表达式
is_nullable yes_or_no 如果该属性是可能为空的,值为YES,否则为NO
data_type character_data 如果该属性是一个内建类型,此列值为该属性的数据类型;如果该属性是某种数组,此列值为ARRAY(在这种情况下,见视图element_types);其他情况,此列值为USER-DEFINED(在这种情况下,该类型在attribute_udt_name和相关列中标识)。
character_maximum_length cardinal_number 如果data_type标识一个字符或位串类型,这里是声明的最大长度;如果没有声明最大长度,则对于所有其他数据类型为空。
character_octet_length cardinal_number 如果data_type标识一个字符类型,这里是一个数据的最大可能长度(以字节计);对其他所有数据类型为空。最大字节长度取决于声明的字符最大长度(见上文)和服务器编码。
character_set_catalog sql_identifier 应用于一个PostgreSQL中不可用的特性
character_set_schema sql_identifier 应用于一个PostgreSQL中不可用的特性
character_set_name sql_identifier 应用于一个PostgreSQL中不可用的特性
collation_catalog sql_identifier 包含此属性排序规则的数据库名(总是当前数据库),如果默认或者该属性的数据类型不可排序则为空
collation_schema sql_identifier 包含此属性排序规则的模式名,如果默认或者该属性的数据类型不可排序则为空
collation_name sql_identifier 该属性排序规则的名称,如果默认或者该属性的数据类型不可排序则为空
numeric_precision cardinal_number 如果data_type标识一种数字类型,这列包含这个属性类型的(声明的或隐式的)精度。精度指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。
numeric_precision_radix cardinal_number 如果data_type标识一种数字类型,这一列指示numeric_precisionnumeric_scale列中的值是基于什么来表示。该值为 2 或 10。对于所有其他数据类型,这一列为空。
numeric_scale cardinal_number 如果data_type标识一种准确数字类型,这列包含这个属性类型的(声明的或隐式的)比例。比例指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。
datetime_precision cardinal_number 如果data_type标识一种日期、时间、时间戳或时间间隔类型,这一列包含这个属性类型的(声明的或隐式的)分数秒的精度,也就是秒值的小数点后的十进制位数。对于所有其他数据类型,这一列为空。
interval_type character_data 如果data_type标识一种时间间隔类型,这一列包含时间间隔为这个属性包括哪些域的声明,例如YEAR TO MONTHDAY TO SECOND等等。如果没有指定域限制(也就是该时间间隔接受所有域),并且对于所有其他数据类型,这个域为空。
interval_precision cardinal_number 应用于一个PostgreSQL中不可用的特性(关于时间间隔类型属性的分数秒精度可见datetime_precision
attribute_udt_catalog sql_identifier 属性数据类型被定义的数据库名(总是当前数据库)
attribute_udt_schema sql_identifier 属性数据类型被定义的模式名
attribute_udt_name sql_identifier 属性数据类型的名称
scope_catalog sql_identifier 应用于一个PostgreSQL中不可用的特性
scope_schema sql_identifier 应用于一个PostgreSQL中不可用的特性
scope_name sql_identifier 应用于一个PostgreSQL中不可用的特性
maximum_cardinality cardinal_number 总是空,因为数组在PostgreSQL中总是有无限制的最大势
dtd_identifier sql_identifier 该列的数据类型描述符的一个标识符,在从属于该表的数据类型标识符之中唯一。这主要用于与这类标识符的其他实例进行连接(该标识符的指定格式没有被定义并且不保证在未来的版本中保持相同)。
is_derived_reference_attribute yes_or_no 应用于一个PostgreSQL中不可用的特性

关于某些列的详情,参见第十六节之下的一个相似结构的视图。

七、character_sets

        视图character_sets标识当前数据库中可用的字符集。因为 PostgreSQL 不支持在同一个数据库中有多个字符集,这个视图只显示一个字符集,它就是数据库编码。

注意下列术语在 SQL 标准中是怎样使用的:

字元集(character repertoire)

        字符的一个抽象集合,例如UNICODEUCSLATIN1。它不作为一个 SQL 对象显示,但是在这个视图中可见。

字符编码形式(character encoding form)

        某种字元集的一种编码。大部分较老的字元集只使用一种编码形式,并且因此它们没有独立的名字(例如LATIN1就是一种适用于LATIN1字元集的编码形式)。但是 Unicode 就有几种编码形式如UTF8UTF16等等(并非全部被 PostgreSQL 支持)。编码形式不作为一个 SQL 对象显示,但是在这个视图中可见。

字符集(character set)

        一个标识一种字元集、一种字符编码以及一种默认排序规则的命名 SQL 对象。一个预定义的字符集通常具有和一种编码形式相同的名字,但是用户可以定义其他名字。例如,字符集UTF8通常标识字元集UCS、编码形式UTF8以及某种默认排序规则。

你可以把 PostgreSQL 中的一种“编码”想成一个字符集或是一种字符编码形式。它们将具有相同的名字,并且在一个数据库中只能用其中一个。

表 3.5. character_sets

名称 数据类型 描述
character_set_catalog sql_identifier 当前字符集并未被实现为模式对象,因此这一列为空。
character_set_schema sql_identifier 当前字符集并未被实现为模式对象,因此这一列为空。
character_set_name sql_identifier 该字符集的名字,当前实现为显示该数据库编码的名字
character_repertoire sql_identifier 字元集,如果编码为UTF8则显示UCS,否则只显示编码名称
form_of_use sql_identifier 字符编码形式,与数据库编码相同
default_collate_catalog sql_identifier 包含该默认排序规则的数据库名(如果任意排序规则被标识,总是当前数据库)
default_collate_schema sql_identifier 包含该默认排序规则的模式名
default_collate_name sql_identifier 默认排序规则的名字。该默认排序规则被标识为匹配当前数据库的COLLATECTYPE设置的排序规则。如果没有那种排序规则,那么这一列和相关模式以及目录列为空。

八、check_constraint_routine_usage

        视图check_constraint_routine_usage标识被检查约束琐事使用的例程(函数和过程)。只有被一个当前启用的角色所拥有的例程才被显示。

表 3.6. check_constraint_routine_usage

名称 数据类型 描述
constraint_catalog sql_identifier 包含该约束的数据库名(总是当前数据库)
constraint_schema sql_identifier 包含该约束的模式名
constraint_name sql_identifier 约束名
specific_catalog sql_identifier 包含该函数的数据库名(总是当前数据库)
specific_schema sql_identifier 包含该函数的模式名
specific_name sql_identifier 该函数的“指定名称”。详见第四十节

九、check_constraints

        视图check_constraints包含所有检查约束,不管是定义在一个表上的还是定义在一个域上的,它们被一个当前启用的角色所拥有(表或域的拥有者就是约束的拥有者)。

表 3.7. check_constraints

名称 数据类型 描述
constraint_catalog sql_identifier 包含该约束的数据库名(总是当前数据库)
constraint_schema sql_identifier 包含该约束的模式名
constraint_name sql_identifier 约束名
check_clause character_data 该检查约束的检查表达式

十、collations

        视图collations包含在当前数据库中可用的排序规则。

表 3.8. collations

名称 数据类型 描述
collation_catalog sql_identifier 包含该排序规则的数据库名(总是当前数据库)
collation_schema sql_identifier 包含该排序规则的模式名
collation_name sql_identifier 默认排序规则的名称
pad_attribute character_data 总是NO PAD(另一种选择PAD SPACE没有被 PostgreSQL 支持)

十一、collation_character_set_applicability

        视图collation_character_set_applicability标识可用的排序规则适用于哪些字符集。在 PostgreSQL 中,每个数据库中只有一种字符集(解释见第七节),因此这个视图没有提供很有用的信息。

表 3.9. collation_character_set_applicability

名称 数据类型 描述
collation_catalog sql_identifier 包含该排序规则的数据库名(总是当前数据库)
collation_schema sql_identifier 包含该排序规则的模式名
collation_name sql_identifier 默认排序规则的名称
character_set_catalog sql_identifier 当前字符集还未被实现为模式对象,所以这一列为空
character_set_schema sql_identifier 当前字符集还未被实现为模式对象,所以这一列为空
character_set_name sql_identifier 字符集名称

十二、column_domain_usage

        视图column_domain_usage标识所有使用定义在当前数据库中并且被一个当前启用的角色拥有的域的列(表列或视图列)。

表 3.10. column_domain_usage

名称 数据类型 描述
domain_catalog sql_identifier 包含该域的数据库名(总是当前数据库)
domain_schema sql_identifier 包含该域的模式名
domain_name sql_identifier 域名称
table_catalog sql_identifier 包含该表的数据库名(总是当前数据库)
table_schema sql_identifier 包含该表的模式名
table_name sql_identifier 表名称
column_name sql_identifier 列名称

十三、column_options

        视图column_options包含为当前数据库中外部表列定义的所有选项。只有当前用户能够访问(作为拥有者或具有某些特权)的那些外部表列才被显示。

表 3.11. column_options

名称 数据类型 描述
table_catalog sql_identifier 包含该外部表的数据库名(总是当前数据库)
table_schema sql_identifier 包含该外部表的模式名
table_name sql_identifier 外部表名
column_name sql_identifier 列名称
option_name sql_identifier 一个选项名
option_value character_data 该选项的值

十四、column_privileges

        视图column_privileges标识所有授予给一个当前启用的角色或者被一个当前启用的角色授予的特权。对每一个列、授予者、被授予者的组合只有一行。

如果一个特权被授予在一整个表上,它在这个视图中被显示为在每一列上授予,但是只有可用于列粒度的特权类型才会这样: SELECTINSERT、 UPDATEREFERENCES

表 3.12. column_privileges

名称 数据类型 描述
grantor sql_identifier 授予该特权的角色名
grantee sql_identifier 被授予该特权的角色名
table_catalog sql_identifier 包含该列的表所在的数据库名(总是当前数据库)
table_schema sql_identifier 包含该列的表所在的模式名
table_name sql_identifier 包含该列的表名
column_name sql_identifier 列名称
privilege_type character_data 特权类型:SELECT、 INSERTUPDATE或 REFERENCES
is_grantable yes_or_no 如果该特权是可授予的,则为YES,否则为NO

十五、column_udt_usage

        视图column_udt_usage标识所有使用被一个当前启用的角色拥有的数据类型的列。注意在PostgreSQL中,内建数据类型的行为和用户定义的类型相似,因此它们也被包括在这里。详见第十六节

表 3.13. column_udt_usage

名称 数据类型 描述
udt_catalog sql_identifier 该列数据类型(如果适用,底层的域类型)被定义的数据库名(总是当前数据库)
udt_schema sql_identifier 该列数据类型(如果适用,底层的域类型)被定义的模式名
udt_name sql_identifier 该列数据类型(如果适用,底层的域类型)的名称
table_catalog sql_identifier 包含该表的数据库名(总是当前数据库)
table_schema sql_identifier 包含该表的模式名
table_name sql_identifier 表名称
column_name sql_identifier 列名称

十六、columns

        视图columns包含数据库中有关所有表列(或视图列)的信息。系统列(oid等)不被包括在内。只有那些当前用户能够访问(作为拥有者或具有某些特权)的列才被显示。

表 3.14. columns

名称 数据类型 描述
table_catalog sql_identifier 包含该表的数据库名(总是当前数据库)
table_schema sql_identifier 包含该表的模式名
table_name sql_identifier 表名称
column_name sql_identifier 列名称
ordinal_position cardinal_number 该列在表内的顺序位置(从 1 开始计)
column_default character_data 该列的默认表达式
is_nullable yes_or_no 如果该列可以为空,则为YES,否则为NO。一个非空约束是让一列成为不能为空的方法,但还有其他方法。
data_type character_data 如果该列的数据类型是一种内建类型,则为该列的数据类型;如果是某种数组(此种情况见视图element_types),则为ARRAY;否则为USER-DEFINED(此种情况下该类型被标识在udt_name和相关列中)。如果该列基于一个域,这一列引用该域底层的类型(该列被标识在domain_name和相关列中)。
character_maximum_length cardinal_number 如果data_type标识一种字符或位串类型,这里是声明的最大长度;如果没有声明最大长度或者所有其他数据类型,这里为空。
character_octet_length cardinal_number 如果data_type标识一个字符类型,这里是一个数据的最大可能长度(以字节计);对其他所有数据类型为空。最大字节长度取决于声明的字符最大长度(见上文)和服务器编码。
numeric_precision cardinal_number 如果data_type标识一种数字类型,这列包含这个属性类型的(声明的或隐式的)精度。精度指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。
numeric_precision_radix cardinal_number 如果data_type标识一种数字类型,这一列指示numeric_precisionnumeric_scale列中的值是基于什么来表示。该值为 2 或 10。对于所有其他数据类型,这一列为空。
numeric_scale cardinal_number 如果data_type标识一种准确数字类型,这列包含这个属性类型的(声明的或隐式的)比例。比例指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。
datetime_precision cardinal_number 如果data_type标识一种日期、时间、时间戳或时间间隔类型,这一列包含这个属性类型的(声明的或隐式的)分数秒的精度,也就是秒值的小数点后的十进制位数。对于所有其他数据类型,这一列为空。
interval_type character_data 如果data_type标识一种时间间隔类型,这一列包含时间间隔为这个属性包括哪些域的声明,例如YEAR TO MONTHDAY TO SECOND等等。如果没有指定域限制(也就是该时间间隔接受所有域),并且对于所有其他数据类型,这个域为空。
interval_precision cardinal_number 应用于一个PostgreSQL中不可用的特性(关于时间间隔类型属性的分数秒精度可见datetime_precision
character_set_catalog sql_identifier 应用于一个PostgreSQL中不可用的特性
character_set_schema sql_identifier 应用于一个PostgreSQL中不可用的特性
character_set_name sql_identifier 应用于一个PostgreSQL中不可用的特性
collation_catalog sql_identifier 包含此属性排序规则的数据库名(总是当前数据库),如果默认或者该属性的数据类型不可排序则为空
collation_schema sql_identifier 包含此属性排序规则的模式名,如果默认或者该属性的数据类型不可排序则为空
collation_name sql_identifier 该属性排序规则的名称,如果默认或者该属性的数据类型不可排序则为空
domain_catalog sql_identifier 如果该列有一个域类型,这里是该域所在的数据库名(总是当前数据库),否则为空。
domain_schema sql_identifier 如果该列有一个域类型,这里是该域所在的模式名,否则为空。
domain_name sql_identifier 如果该列有一个域类型,这里是该域的名称,否则为空。
udt_catalog sql_identifier 该列数据类型(如果适用,底层的域类型)被定义的数据库名(总是当前数据库)
udt_schema sql_identifier 该列数据类型(如果适用,底层的域类型)被定义的模式名
udt
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值