架构
数据库包含一个或多个命名 schemas。数据库中的每个 schema 包含表和其他类型的命名对象。默认情况下,数据库具有单个 schema(名为 PUBLIC)。您可以通过 schemas 使用公用名称分组数据库对象。架构类似于文件系统目录,但架构不能嵌套。
相同的数据库对象名称可以用在同一数据库的不同 schemas 中,没有冲突。例如,MY_SCHEMA 和 YOUR_SCHEMA 都可以包含名为 MYTABLE 的表。具有所需权限的用户可以访问数据库的多个 Schemas 中的对象。
默认情况下,在数据库搜索路径中的第一个 schema 内创建对象。有关信息,请参阅此部分后面的搜索路径。
Schema 可帮助解决多用户环境中的组织和并发问题,方式如下:
-
让多名开发人员使用同一数据库且互不干扰。
-
将数据库对象组织到逻辑组以使其更易于管理。
-
使应用程序能够将其对象放入到单独的 schemas 中,以使其对象名称不与其他应用程序所使用的对象名称冲突。
创建、修改和删除架构
任何用户都可以创建 schema 和修改或删除其拥有的 schema。
您可以执行以下操作:
-
要创建 schema,请使用 CREATE SCHEMA 命令。
-
要更改 schema 所有者,请使用 ALTER SCHEMA 命令。
-
要删除 schema 及其对象,请使用 DROP SCHEMA 命令。
-
要在 schema 内创建表,请以 schema_name.table_name 格式创建表。
要查看所有 Schemas 的列表,请查询 PG_NAMESPACE 系统目录表:
select * from pg_namespace;
要查看属于某 schema 的表列表,请查询 PG_TABLE_DEF 系统目录表。例如,以下查询会返回 PG_CATALOG schema 中的表列表。
select distinct(tablename) from pg_table_def where schemaname = 'pg_catalog';
搜索路径
搜索路径定义在 search_path 参数中,采用逗号分隔的 schema 名称列表形式。搜索路径指定在通过不包含 schemas 限定词的简单名称引用对象(例如,表或函数)时,搜索 schema 的顺序。
如果创建了对象而未指定目标 schema,则将该对象添加到搜索路径中列出的第一个 schema。当不同 schemas 中存在同名的对象时,未指定 schema 的对象名称将引用搜索路径中包含具有该名称的对象的第一个 schema。
要更改当前会话的默认 schema,请使用 SET 命令。
有关更多信息,请参阅“配置引用”中的 search_path 描述。
基于 Schema 的权限
基于 Schema 的权限由 Schema 的拥有者确定:
-
默认情况下,所有用户都对数据库的 PUBLIC Schema 具有 CREATE 和 USAGE 权限。要禁止用户在数据库的 PUBLIC Schema 中创建对象,请使用 REVOKE 命令删除该权限。
-
除非对象拥有者向用户授予了 USAGE 权限,否则用户无法访问其不拥有的 Schemas 中的任何对象。
-
如果已向用户授予对其他用户所创建的 Schema 的 CREATE 权限,则这些用户可以在该 Schema 中创建对象。