在平时的工作中,我们经常使用的是默认的表空间和默认的schema(public),所以往住会忽略了数据库表空间和模式的概念。
什么是schema
一个数据库可以包含一个或多个已命名的schema,schema下包含表,schema还可以包含其他对象,比如:类型,函数,操作符等。同一个对象名可以在不同的schema下使用而不会导致冲突;和数据库不同,schema不是严格分离的:只要有权限,一个用户可以访问他所连接的数据库中任意模式中的对象。
模式存在的原因:
- 允许多个用户使用一个数据库而不会干扰其他用户
- 把数据库对象组织成逻辑组,让它们便于管理
- 第三方应用可以放在不同的schema中,这样它们就不会和其他对象名字冲突
模式类似于操作系统层次目录,只不过模式不能嵌套。
什么是表空间
表空间是实际的数据存储的地方。一个数据库schema可能存在于多个表空间,一个表空间也可以为多个schema服务
通过使用表空间,管理员可以控制磁盘的布局。表空间的最常用的作用是优化性能,例如,一个最常用的索引可以建立在非常快的硬盘上,而不太常用的表可以建立在便宜的硬盘上,比如用来存储用于进行归档文件的表。
PostgreSQL表空间、数据库、模式、表、用户、角色之间的关系
角色与用户的关系
在PostgreSQL中,存在两个容易混淆的概念:角色/用户。之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象。唯一的区别是在创建的时候:
1.创建角色role1:
create role role1 with password '123456';
如果用这个角色登录会报错:没有登录权限,但可以增加登录权限,这样角色和用户就没有区别了。
给角色role1增加login权限: alter role role1 login
2.创建用户guest:
create uesr guest with password '123456';
用户可以直接登录,也就是角色与用户的区别就是差一个登录权限,当然不同角色可以赋予不同的权限,然后授权给用户。
3.授权角色给用户
grant role_name to username
4.给角色授权
grant select,insert,update,delete,alter,create on object_name to role_name
object_name可以是表、schema、数据库比如on database dbname|on schema schemaname|on tablename
这样的写法。
实际上可以不用创建角色,直接创建用户,然后授权也是一样的。
数据库与模式的关系
模式(schema)是对数据库(database)逻辑分割。
在数据库创建的同时,就已经默认为数据库创建了一个模式:public
,这也是该数据库的默认模式。所有为此数据库创建的对象(表、函数、试图、索引、序列等)都是创建在这个模式中的
表空间与数据库的关系
默认的数据库所有者是当前创建数据库的角色,默认的表空间是系统的默认表空间pg_default
。
在PostgreSQL中,数据的创建是通过克隆数据库模板来实现的,这与SQL SERVER是同样的机制。由于CREATE DATABASE dbname
并没有指明数据库模板,所以系统将默认克隆template1数据库,得到新的数据库dbname。(By default, the new database will be created by cloning the standard system database template1)
template1数据库的默认表空间是pg_default,这个表空间是在数据库初始化时创建的,所以所有template1中的对象将被同步克隆到新的数据库中
完整的默认语句是这样的:
create database dbname template template1 tablespace tablespacename; alter database dbname owner to login_username(当前登录的用户名);
创建表空间的路径一定要存在且权限也要有,不会自动创建的。
postgres=# create tablespace clc_tablespace owner clc location '/var/lib/pgsql/clc'; ERROR: directory "/var/lib/pgsql/clc" does not exist postgres=# create tablespace clc_tablespace owner clc location '/var/lib/pgsql/clc'; ERROR: could not set permissions on directory "/var/lib/pgsql/clc": Operation not permitted postgres=# create tablespace clc_tablespace owner clc location '/var/lib/pgsql/clc'; CREATE TABLESPACE postgres=# create database clc_db owner clc tablespace clc_tablespace; CREATE DATABASE postgres=# \l+ List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description -----------+----------+----------+-------------+-------------+-----------------------+---------+----------------+-------------------------------------------- clc_db | clc | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 7793 kB | clc_tablespace | clc_test | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +| 7933 kB | pg_default | | | | | | postgres=CTc/postgres+| | | | | | | | clc=CTc/postgres | | | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 7965 kB | pg_default | default administrative connection database template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 7793 kB | pg_default | unmodifiable empty database | | | | | postgres=CTc/postgres | | | template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 7793 kB | pg_default | default template for new databases | | | | | postgres=CTc/postgres | | | (5 rows)
原文链接:PostgreSQL的模式、表、空间、用户间的关系,转载请注明来源!