一个PostgreSQL数据库包含一个或多个命名的schema,schema包含表,其它命名的对象,不同模式下面可以有相同的对象名而不会发生冲突。例如:模式A和模式B下面可以各自有T1表。
一个用户可以访问任何模式下面的对象,只要他有权限,有了权限之后,访问的时候加上schema.对象名。PostgreSQL中的模式跟Oracle也都差不多,大同小异,Oracle中也有schema,例如Scott,HR,SYSTEM等等。
schema的作用:
1). 允许多个用户使用一个数据库而不会干扰其它用户。
2). 把数据库对象组织成逻辑组,让它们更便于管理。
3). 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。
1、public 模式
每个新创建的数据库下面都有一个默认的Public模式,如果没有创建其他模式,则在创建数据库对象的时候默认使用public模式。在public模式下,所有的用户都必须有public模式的CREATE和USAGE权限。
2、编辑schema
2.1、创建schema
CREATE SCHEMA myschema;通过以上命令可以创建名字为myschema的模式,在该模式被创建后,其便可拥有自己的一组逻辑对象,如表、视图和函数等。
创建schema的时候,还可以指定创建相应的表,视图等等
zxydb=# create schema zxyschema1 authorization zxy create table t_zxy_01(a integer) create view v_zxy_01 as select * from t_zxy_01;
CREATE SCHEMA
zxydb=# select * from zxyschema1.t_zxy_01;
a
---
(0 行记录)
zxydb=# select * from zxyschema1.v_zxy_01;
a
---
(0 行记录)
创建schema的详情,使用\h create schema
zxydb=# \h alter schema
命令: ALTER SCHEMA
描述: 更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }
3、查看当前使用的schema
postgres=# select current_schema();
current_schema
----------------
public
(1 行记录)
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 行记录)
4、查看当前数据库有多少schema
zxydb=# \dn+
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
-------------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
zxyschema | zxy | |
zxyschema_1 | zxy | |
(3 行记录)
5、修改schema的名称
zxydb=# alter schema zxyschema1 rename to zxyschema_1;
ALTER SCHEMA
zxydb=# \dn+
架构模式列表
名称 | 拥有者 | 存取权限 | 描述
-------------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
zxyschema | zxy | |
zxyschema_1 | zxy | |
(3 行记录)
6、修改schema的owner
zxydb=# \h alter schema
命令: ALTER SCHEMA
描述: 更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }
详细修改schema查看\h alter schema
zxydb=# \h alter schema
命令: ALTER SCHEMA
描述: 更改架构模式的定义
语法:
ALTER SCHEMA 名称 RENAME TO 新的名称
ALTER SCHEMA 名称 OWNER TO { 新的属主 | CURRENT_USER | SESSION_USER }
6、访问模式和权限
查看当前模式下的表
zxydb=# \d
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+------+--------+--------
public | test | 数据表 | zxy
(1 行记录)
zxydb=# select * from test;
a1
----
(0 行记录)
查看不同模式下的表
zxydb=# select * from zxyschema_1.t_zxy_01;
a
---
(0 行记录)
如果想查看数据库中所有的表,可以查看pg_tables
注意:用户访问不同模式的时候,不仅需要授权,还需要有usage权限.
grant all on schema.table to A;
grant usage on schema to A;
7、删除模式
zxydb=# drop schema zxyschema;
如果要删除模式及其所有对象,请使用级联删除:DROP SCHEMA zxyschema CASCADE;
8、模式搜索路径:
我们在使用一个数据库对象时可以使用它的全称来定位对象,然而这样做往往也是非常繁琐的,每次都不得不键入owner_name.object_name。PostgreSQL中提供了模式搜索路径,这有些类似于Linux中的$PATH环境变量,当我们执行一个Shell命令时,只有该命令位于$PATH的目录列表中,我们才可以通过命令名直接执行,否则就需要输入它的全路径名。PostgreSQL同样也通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中 没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。
在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外,它还是在CREATE TABLE没有声明模式名的时候,新建表所属于的模式。要显示当前搜索路径,使用下面的命令:
zxydb=SHOW search_path;
search_path
----------------
"$user",public
(1 row)
可以将新模式加入到搜索路径中,如:
SET search_path TO zxyschema,public;
为搜索路径设置指定的模式,如:
SET search_path TO zxyschema;--当前搜索路径中将只是包含zxyschema一种模式。