首页 » Linux » PostgreSQL的模式、表、空间、用户间的关系

PostgreSQL的模式、表、空间、用户间的关系

 
文章目录

在平时的工作中,我们经常使用的是默认的表空间和默认的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的模式、表、空间、用户间的关系,转载请注明来源!

0