一、概述
模式(Schema)是数据库中的一个概念,可以将其理解为一个命名空间或目录,不同的模式下可以有相同名称的表、函数等对象而不会产生冲突。提出模式的概念是为了便于管理,只要有权限,各个模式的对象可以互相调用。
在 PostgreSQL 中,一个数据库包含一个或多个模式,模式中又包含了表、函数以及操作符等数据库对象。在 PostgreSQL 中,不能同时访问不同数据库中的对象,当要访问另一个数据库中的表或其他对象时,需要重新连接到这个数据库,而模式却没有此限制,一个用户在连接到一个数据库后,就可以同时访问这个数据库中多个模式的对象。从这个特性来说,PostgreSQL 中模式的概念与 MySQL 中的 Database 的概念是等价的,在 MySQL 中也可以同时访问多个 Database 中的对象,就与 PostgreSQL 中可以同时访问多个 Schema 中的对象是一样的。在 Oracle 数据库中,一个用户就对应一个 Schema。
需要模式的主要原因有以下几个:
- 允许多个用户使用同一个数据库且用户之间又不会互相干扰。
- 把数据库对象放在不同的模式下组织成逻辑组,使数据库对象更便于管理。
- 第三方的应用可以放在不同的模式中,这样就不会和其他对象的名字产生冲突了。
二、使用
2.1 创建模式
--创建名为 sch1 的模式
CREATE SCHEMA sch1;
--创建名为 u1 且 owner 为 u1 用户的模式
CREATE SCHEMA AUTHORIZATION u1;
--创建名为 sch1 且 owner 为 u1 用户的模式
CREATE SCHEMA sch1 AUTHORIZATION u1;
2.2 修改模式
--将模式 sch1 名修改为 sch2
ALTER SCHEMA sch1 RENAME TO sch2;
--将模式 sch1 的 owner 修改为 u2 用户
ALTER SCHEMA sch1 OWNER TO u2;
##2.3 删除模式
--删除模式 sch1
DROP SCHEMA sch1;
--删除模式 sch1 及其中存储的对象
DROP SCHEMA sch1 CASCADE;
三、公共模式
要创建或者访问模式中的对象,需要先写出一个受修饰的名字,这个名字包含模式名及表名,它们之间用一个“.”分隔开,如 schema_name.table_name。当创建或访问对象未加修饰模式名时,会默认去访问 public 模式,该模式是创建数据库时自动创建的,所有用户均可访问使用该模式,该模式也被称为公共模式。
四、模式搜索路径
使用数据库对象时,虽然可以使用全称来定位该对象,但是这样一来,每次都不得不键入schema_name.object_name,这显然很烦琐。对此,PostgreSQL 中提供了模式搜索路径,这种形式有些类似 Linux 中 PATH 环境变量的用法,当我们执行一个 Shell 命令时,只有该命令位于 PATH 的目录列表中就可以通过命令名直接执行,否则就需要输入它的全路径名。模式搜索路径由参数 search_path 控制,默认值为 “$user”, public 可通过如下命令查询:
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)
- “$user”:表示跟当前连接用户同名的模式名。
- public:public 模式。
示例:
--在搜索路径下的模式,无需加模式界定即可查询对应表数据
postgres=# \dn
List of schemas
Name | Owner
----------+----------
postgres | postgres
public | postgres
sch1 | postgres
sch2 | postgres
(4 rows)
postgres=# \dt
List of relations
Schema | Name | Type | Owner
----------+------+-------+----------
postgres | t | table | postgres
public | tp | table | postgres
(2 rows)
postgres=# select * from t;
id
----
1
(1 row)
postgres=# select * from tp;
id
----
1
(1 row)
--不在搜索路径下的模式,必须加模式界定,才能查询对应数据
postgres=# select * from t1;
ERROR: relation "t1" does not exist
LINE 1: select * from t1;
^
postgres=# select * from sch1.t1;
id
----
1
(1 row)
postgres=# select * from t2;
ERROR: relation "t2" does not exist
LINE 1: select * from t2;
^
postgres=# select * from sch2.t2;
id
----
1
(1 row)
--将 sch1,sch2 添加到模式搜索路径后,可以不加模式界定进行查询
postgres=# alter system set search_path = "$user", public,sch1,sch2;
ALTER SYSTEM
postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
postgres=# show search_path;
search_path
-----------------------------
"$user", public, sch1, sch2
(1 row)
postgres=# select * from t1;
id
----
1
(1 row)
postgres=# select * from t2;
id
----
1
(1 row)
五、模式的权限
默认情况下,所有用户均具有访问和管理 public 模式的权限。当多个应用用户同时使用同一个数据库下的不同模式时,会存在误将数据存放在 public 公共模式下的风险,可能造成数据混乱,不便于后期的维护管理,可通过以下命令回收所有用户在 public 模式下创建对象的权限。
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
默认情况下,只有模式的所有者(owner)及超级管理员用户具有访问和管理非 public 模式的权限,若其他非所有者用户需要访问管理非 public 模式,需要对用户进行模式的相关授权。
GRANT {
{
CREATE|USAGE}|ALL [PRIVILEGES]} ON SCHEMA 模式名 TO 用户名|PUBILC;
CREATE:对于 schema,允许在模式中创建新的 table、index等。
USAGE:对于 schema,允许访问指定模式中包含的对象;对于 sequence,允许使用 currval 和 nextval 函数。对于类型和域,允许在创建表,函数和其他模式对象时使用类型或域。
ALL PRIVILEGES:一次授予所有可用权限。
PUBLIC:所有用户。
示例:
--授权用户 u1 可以访问 sch1 模式
GRANT USAGE ON SCHEMA sch1 TO u1;
--授权用户 u1 可以在 sch1 模式下创建对象
GRANT CREATE ON SCHEMA sch1 TO u1;
--授予用户 u1 对 sch1 模式的所有访问管理权限(此处仅表示可访问管理模式空间,并不是可以访问模式空间下的所有表视图之类的具体对象)
GRANT ALL PRIVILEGES ON SCHEMA sch1 TO u1;
六、修改当前默认模式
https://xiaosonggong.blog.csdn.net/article/details/120053529
https://xiaosonggong.blog.csdn.net/article/details/122812013