PostgreSql 模式

一、概述

  模式(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

猜你喜欢

转载自blog.csdn.net/songyundong1993/article/details/131568767