一个数据库包含一个或多个命名的模式,模式又包含表。模式还包含其它命名的对象,包括数据类型、函数,以及操做符。同一个对象名能够在不一样的模式里使用而 不会致使冲突; 好比,schema1和myschema均可以包含叫作mytable的表。和数据库不一样,模式不是严格分离的:一个用户能够访问他所链接的数据库中的任 意模式中的对象,只要他有权限。
咱们须要模式有如下几个主要缘由:
1). 容许多个用户使用一个数据库而不会干扰其它用户。
2). 把数据库对象组织成逻辑组,让它们更便于管理。
3). 第三方的应用能够放在不一样的模式中,这样它们就不会和其它对象的名字冲突。
1. 建立模式:
CREATE SCHEMA myschema;
经过以上命令能够建立名字为myschema的模式,在该模式被建立后,其即可拥有本身的一组逻辑对象,如表、视图和函数等。
2. public模式:
在介绍后面的内容以前,这里咱们须要先解释一下public模式。每当咱们建立一个新的数据库时,PostgreSQL都会为咱们自动建立该模式。当登陆到该数据库时,若是没有特殊的指定,咱们将以该模式(public)的形式操做各类数据对象,如:
CREATE TABLE products ( ... ) 等同于
CREATE TABLE public.products ( ... )
3. 权限:
缺省时,用户看不到模式中不属于他们全部的对象。为了让他们看得见,模式的全部者须要在模式上赋予USAGE权限。为了让用户使用模式中的对象,咱们可能须要赋予额外的权限,只要是适合该对象的。PostgreSQL根据不一样的对象提供了不一样的权限类型,如:
GRANT ALL ON SCHEMA myschema TO public;
上面的ALL关键字将包含
CREATE和
USAGE两种权限。若是public模式拥有了myschema模式的CREATE权限,那么登陆到该模式的用户将能够在myschema模式中建立任意对象,如:
CREATE TABLE myschema.products (
product_no integer,
name text,
price numeric CHECK (price > 0),
);
在为模式下的全部表赋予权限时,须要将权限拆分为各类不一样的表操做,如:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
TO public;
在为模式下的全部Sequence序列对象赋予权限时,须要将权限拆分为各类不一样的Sequence操做,如:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
GRANT SELECT, UPDATE, USAGE ON SEQUENCES TO public;
在为模式下的全部函数赋予权限时,仅考虑执行权限,如:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
GRANT EXECUTE ON FUNCTIONS TO 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)
4. 删除模式:
DROP SCHEMA myschema;
若是要删除模式及其全部对象,请使用级联删除:
DROP SCHEMA myschema CASCADE;
5. 模式搜索路径:
咱们在使用一个数据库对象时可使用它的全称来定位对象,然而这样作每每也是很是繁琐的,每次都不得不键入 owner_name.object_name。PostgreSQL中提供了模式搜索路径,这有些相似于Linux中的$PATH环境变量,当咱们执行 一个Shell命令时,只有该命令位于$PATH的目录列表中,咱们才能够经过命令名直接执行,不然就须要输入它的全路径名。PostgreSQL一样也 经过查找一个搜索路径来判断一个表到底是哪一个表,这个路径是一个须要查找的模式列表。在搜索路径里找到的第一个表将被看成选定的表。若是在搜索路径中 没有匹配表,那么就报告一个错误,即便匹配表的名字在数据库其它的模式中存在也如此。
在搜索路径中的第一个模式叫作当前模式。除了是搜索的第一个模式以外,它仍是在CREATE TABLE没有声明模式名的时候,新建表所属于的模式。要显示当前搜索路径,使用下面的命令:
MyTest=>
SHOW search_path;
search_path
----------------
"$user",public
(1 row)
能够将新模式加入到搜索路径中,如:
SET search_path TO myschema,public;
为搜索路径设置指定的模式,如:
SET search_path TO myschema;
--当前搜索路径中将只是包含myschema一种模式。