PostgreSQL 模式介绍

模式(schema)是数据库中的一个概念,可以将其理解为一个命名空间或者目录(用\dn查看有哪些模式)。类似于操作系统层次的目录,只不过模式不能嵌套。

一个数据库包含一个或多个命名的模式,模式又包含表。模式还包含其它命名的对象,包括数据类型,函数,以及操作符。同一个对象名可以在不同的模式里使用而不会导致冲突;比如,schema1 和 myschema 都可以包含叫做 mytable 的表。和数据库不同,模式不是严格分离的,一个用户可以访问他所连接的数据库中的任意模式中的对象,只要他有权限。

我们需要模式的原因主要有以下几个:

允许多个用户使用一个数据库而不会彼此干扰。
把数据库对象组织成逻辑组,让它们更便于管理。
第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。

创建模式

CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name

实例:

create schema demo_schema;
create schema demo_schema AUTHORIZATION hmxz2nn;

在指定模式里创建表,如:

CREATE TABLE myschema.mytable (
...
);

修改模式

ALTER SCHEMA name RENAME TO new_name;
ALTER SCHEMA name OWNER TO new_owner;

ALTER SCHEMA修改一个模式的定义。

要使用ALTER SCHEMA,你必须是该模式的所有者。 要给一个模式重命名,你必须在该数据库上有CREATE权限。 要修改所有者,你还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 (超级用户自动拥有全部权限。)

删除模式

DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
//DROP SCHEMA从数据库中删除模式。

模式只能被它的所有者或者超级用户删除。请注意, 所有者即使没有拥有模式中任何对象也可以删除模式(以及模式中的所有对象)。

参数
CASCADE:自动删除包含在模式中的对象(表、函数等等)。
RESTRICT:如果模式包含任何对象,则拒绝删除它。这个是缺省。

公共模式

要创建或者访问模式中的对象,需要先写一个受修饰的名字,这个名字包含模式名和表名,它们之间用一个“点”分开,如下:

schema_name.table_name;

通常情况下,创建和访问表的时候都不用指定模式,实际上这时访问的都是“public”模式。每当我们创建一个新的数据库时,postgresql都会自动创建一个名为“public”的模式。当登录到该数据库时,如果没有特殊的指定,都是以该模式操作各种数据对象的。如:

CREATE TABLE products ( ... ); 
等同于
CREATE TABLE public.products ( ... );

模式搜索路径

全称的名字写起来非常费劲,并且我们最好不要在应用里直接写上特定的模式名。因此,表通常都是用未修饰的名字引用的,这样的名字里只有表名字。系统通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。 在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。

在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外, 它还是在 CREATE TABLE 没有声明模式名的时候,新建表所在的地方。

查看当前搜索路径,使用命令:

SHOW search_path;

在缺省的设置中,返回下面的东西:

 search_path
--------------
 $user,public

结果显示的是search_path的默认设置,从这个默认设置可以看到“public”模式总是在搜索路径中。所以一般情况下,若创建的表默认没有指定模式,那都会在“public”模式下。

同时,结果显示第一个元素声明将要搜索一个和当前用户同名的模式。 因为还没有这样的模式存在,所以这条记录被忽略。第二个元素指向public模式。

要把新的模式放到路径中来,我们用

SET search_path TO myschema,public;

模式的权限

缺省时,用户看不到模式中不属于他们所有的对象。为了让他们看得见,模式的所有者需要在模式上赋予 USAGE 权限。为了让用户使用模式中的对象,我们可能需要赋予额外的权限, 只要是适合该对象的。

用户也可以允许在别人的模式里创建对象。要允许这么做, 我们需要赋予在该模式上的 CREATE 权限。 请注意,缺省时,每个人都在 public 模式上 有 CREATE 权限。这样就允许所有可以连接到指定数据库上的用户在这里创建对象。如果你不允许这么做, 你可以撤销这个权限:

REVOKE CREATE ON public FROM PUBLIC;

(第一个 “public” 是模式,第二个 “public” 意思是”所有用户”。 第一句里它是个标识符,而第二句里是个关键字,所以有不同的大小写)。
在收回权限后,其他用户就不能在模式“public”下创建对象了。

在为模式下的所有表赋予权限时,需要将权限拆分为各种不同的表操作,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO public;

在为模式下的所有函数赋予权限时,仅考虑执行权限,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT EXECUTE ON FUNCTIONS TO public;

撤销模式权限可以这么做

REVOKE [CREATE...] ON SCHEMA public FROM PUBLIC;

可以看出,通过以上方式在public模式下为myschema模式创建各种对象是极为不方便的。下面我们将要介绍另外一种方式,即通过role对象,直接登录并关联到myschema对象,之后便可以在myschema模式下直接创建各种所需的对象了。

--创建了和该模式关联的角色对象。
CREATE ROLE myschema LOGIN PASSWORD '123456'; 
--将该模式关联到指定的角色,模式名和角色名可以不相等。
CREATE SCHEMA myschema AUTHORIZATION myschema; 

在Linux Shell下,以myschema的角色登录到数据库MyTest,在密码输入正确后将成功登录到该数据库。

/> psql -d MyTest -U myschema
Password:
MyTest=> CREATE TABLE test(i integer);
CREATE TABLE
MyTest=> \d   --查看该模式下,以及该模式有权限看到的tables信息列表。
          List of relations
 Schema     |   Name   | Type  |  Owner
------------+---------+------+----------
 myschema |   test     | table  | myschema
(1 rows)

使用方式

模式可以以多种方式组织你的数据。下面是一些建议使用的模式, 它们也很容易在缺省配置中得到支持:

1.如果你没有创建任何模式,那么所有用户隐含都访问public模式。 这样就模拟了还没有模式的时候的情景。这种设置建议主要用在 只有一个用户或者数据库里只有几个合作用户的情形。这样的设置 也允许我们平滑地从无模式的环境过渡。

2.你可以为每个用户创建一个模式,名字和用户相同。要记得缺省的搜索路径从$user开始,它会解析为用户名。 因此,如果每个用户都有一个独立的模式,那么他们缺省时访问他们 自己的模式。

3.如果你使用了这样的设置,那么你可能还想撤销对public模式的访问 (或者一并删除了它),因此,用户就真的限制于他们自己的模式了。

4.要安装共享的应用(被所有人使用的表,第三方提供的额外的函数等等), 我们可以把它们放到独立的模式中。只要记得给访问它们的用户赋予合适 的权限就可以了。然后用户就可以通过用一个模式名修饰这些名字来使用 这些额外的对象,或者他们可以把额外的模式放到他们的搜索路径中,由他们定。

转载自:
1.https://www.cnblogs.com/oneTOinf/p/8458166.html
2.https://www.cnblogs.com/xiwang/p/5695309.html
参考:
《PostgreSQL 修炼之道》6.3节

猜你喜欢

转载自blog.csdn.net/hmxz2nn/article/details/82715192