官方文档解释:
一个PostgreSQL数据库集群包含一个或多个已命名数据库。用户和用户组在整个集群范围内是共享的,但是其它数据并不共享。任何与服务器连接的客户都只能访问那个在连接请求里声明的数据库。
注意:集群中的用户并不一定要有访问集群内所有数据库的权限。共享用户名的意思是不能有重名用户。假定同一个集群里有两个数据库和一个joe用户,系统可以配置成只允许joe访问其中的一个数据库。
一个数据库包含一个或多个已命名的模式,模式又包含表。模式还可以包含其它对象,包括数据类型、函数、操作符等。同一个对象名可以在不同的模式里使用而不会导致冲突;比如,schema1和myschema都可以包含一个名为mytable的表。和数据库不同,模式不是严格分离的:只要有权限,一个用户可以访问他所连接的数据库中的任意模式中的对象。
我们需要模式的原因有好多:
模式类似于操作系统层次的目录,只不过模式不能嵌套。
下面是我在自己测试环境中的操作过程:
创建一个基于用户gaoqiang的模式:
music=#
create schema gaoqiang authorization gaoqiang;
CREATE SCHEMA
使用用户gaoqiang登录music数据库:
music=#
\c music gaoqiang
You are now connected to database "music" as user "gaoqiang".
创建表:
music=>
create table summary(id int,name text);
CREATE TABLE
查看表信息,可以看到summary表属于schema gaoqiang:
music=>
\d
List of relations
Schema | Name | Type | Owner
----------+---------+-------+----------
gaoqiang | summary | table | gaoqiang
(1 row)
使用用户postgres登录music数据库,可以看到有一个表summry,属于模式public,这个表实际上是之前创建的,里面已经有数据了:
music=>
\c music postgres
You are now connected to database "music" as user "postgres".
music=#
\d
List of relations
Schema | Name | Type | Owner
--------+---------+-------+----------
public | summary | table | postgres
(1 row)
往新建的schema gaoqiang下的表summary中插入一条数据:
music=#
\c music gaoqiang
You are now connected to database "music" as user "gaoqiang".
music=>
insert into summary values(1,'GaoQiang');
INSERT 0 1
查看表内容:
music=>
select * from summary;
id | name
----+----------
1 | GaoQiang
(1 row)
然后去public模式下的同名表summary中插入一条与刚才不同的数据:
使用postgres用户连接库:
music=>
\c music postgres
You are now connected to database "music" as user "postgres".
插入数据(与刚才那条不同,便于区分):
music=#
insert into summary values(2,'GaoQiang');
INSERT 0 1
查看模式postgres模式下的summary表内容:
music=#
select * from summary;
id | info
----+------------------------------
1 | Eric Gao is a Oracle DBA
1 | Eric Gao is a PostgreSQL DBA
1 | Eric Gao is a AIX SA
1 | Eric Gao is a Linux SA
2 | GaoQiang
(5 rows)
使用postgre用户在postgres模式下查看gaoqiang模式的summary表:
music=#
select * from gaoqiang.summary;
id | name
----+----------
1 | GaoQiang
(1 row)
使用postgre用户在postgres模式下对gaoqiang模式的表中插入数据:
music=#
insert into gaoqiang.summary values(2,'GaoQiang is not 2');
INSERT 0 1
查看gaoqiang.summary的内容:
music=#
select * from gaoqiang.summary;
id | name
----+-------------------
1 | GaoQiang
2 | GaoQiang is not 2
(2 rows)
还是比较简单的,不同品牌的数据库模式的概念可能会有不同,需要区别对待。
阅读(8123) | 评论(0) | 转发(0) |