本文主要介绍PostgreSQL数据库的一些重要知识点,

包括数据库、模式、表空间、用户/角色等概念和关系,

帮助用户理解PostgreSQL数据库的重要概念,

从而能够更好的使用PostgreSQL。

1.ROLE/USER区别

通常ROLE(角色)和USER(用户)是两个不同的概念,

但是在PostgreSQL里没有区分用户和角色,

这里容易和其他数据库的概念混淆,

在PostgreSQL两者区别仅在于用户比角色多了登陆权限。

下面分别是创建ROLE和USER的SQL:

CREATE ROLE kanon1 PASSWORD 'kanon1';
CREATE USER kanon2 PASSWORD 'kanon2';

创建完成后ROLE kanon1不能登陆,

但是USER kanon2能够登陆。

为ROLE kanon1增加LOGIN权限:

ALTER ROLE kanon1 LOGIN;

然后kanon1也能够登陆了。

CREATE USER除了默认具有LOGIN权限之外,

其他与CREATE ROLE是完全相同的。

下面两条SQL语句是等价的:

CREATE ROLE kanon PASSWORD 'kanon' LOGIN;
CREATE USER kanon PASSWORD 'kanon';

角色(用户)可以拥有全局数据库对象,

可以拥有数据库服务器全局范围内的权限,

用于对数据库所有的对象进行管理。

角色不特定于某个单独的数据库,

如果需要管理数据库系统则必须连接到一个数据库上。

2.DATABASE与SCHEMA的关系

SCHEMA(模式)是对DATABASE(数据库)逻辑分割,

SCHEMA可以理解为命名空间,

SCHEMA就是数据库对象的集合。

一个DATABASE至少有一个SCHEMA,

在创建DATABASE时,

自动创建一个默认SCHEMA public。

这个DATABASE创建的所有对象(表、函数、视图、索引、序列等),

如果没有指定SCHEMA,

默认都是属于public。

用户登录到PostgreSQL,连接到一个数据库后,

由于一个DATABASE可以有多个SCHEMA,

需要通过DATABASE的search_path来确定SCHEMA的搜索顺序,

可以通过命令SHOW查看具体的顺序,

也可以通过命令SET来设置顺序。

查看当前数据库搜索路径:

SHOW search_path;

设置新的搜索路径:

SET search_path TO myschema,public;

官方建议

在管理员创建一个DATABASE后,

应该为所有可以连接到该DATABASE的用户,

分别创建一个与用户名相同的SCHEMA,

然后将search_path设置为"$user",

这样当某个用户连接上来后,

默认使用的是与之同名的SCHEMA,

这是一个好的设计架构。

3.为DATABASE对象指定SCHEMA

数据库中一个对象的完整名称为SCHEMA.object,

而不是USER.object。

如果在操作对象时不指定SCHEMA,

则使用登陆用户的默认SCHEMA。

比如查询一个表时,

没有指明该表所属的SCHEMA,

系统自动在表上加上默认的SCHEMA名。

查询freeoa用户的emp表:

select * from emp;

假设freeoa用户默认的SCHEMA为freeoa,

则实际上SQL语句的完整写法:

select * from freeoa.emp;

创建schema kanon,属主为kanon:

CREATE SCHEMA kanon OWNER kanon;

创建表test,指定属于schema kanon:

CREATE TABLE kanon.test (id integer not null);

同一个对象名可以在不同的SCHEMA里使用而不会导致冲突,

比如schema1和schema2都可以包含叫做test的表,

和DATABASE不同,SCHEMA不是严格分离的,

一个用户只要有权限,

可以访问一个DATABASE中的任意SCHEMA。

用户可以允许别人在自己的SCHEMA里创建对象,

需要赋予其他用户在该SCHEMA的CREATE权限。

默认每个人都在SCHEMA public上有CREATE权限,

所以连接到数据库上的用户都可以在public创建对象。

这个权限可以撤销:

REVOKE CREATE ON public FROM PUBLIC;

第一个public是SCHEMA,

第二个PUBLIC是指所有用户。

4.表空间

在PostgreSQL中,表空间是一个目录,

表空间是实际的数据存储的地方,

存储的是它所包含的数据库的各种物理文件。

一个数据库schema可能存在于多个表空间,

一个表空间也可以为多个schema服务。

创建数据库使用CREATE DATABASE dbname,

默认的数据库所有者是当前创建数据库的用户,

默认的表空间是系统的默认表空间pg_default。

在PostgreSQL中,数据库的创建是通过克隆数据库模板来实现的。

由于CREATE DATABASE dbname并没有指明数据库模板,

所以默认使用template1数据库当作克隆模板,

template1中的全部对象将被同步克隆到新的数据库中。

由于template1数据库的默认表空间是pg_default,

所以新的数据库也使用默认表空间是pg_default,

pg_default这个表空间是在数据库初始化时创建的。

创建数据库时指定数据库模板和表空间:

CREATE DATABASE dbname OWNER kanon TEMPLATE template1 TABLESPACE tablespacename;

表空间的作用:

通过使用表空间,管理员可以控制磁盘的布局。

表空间的最常用的作用是优化性能,

比如一个最常用的索引可以建立在非常快的硬盘上,

而不太常用的表可以建立在便宜的硬盘上,

比如用来存储用于进行归档文件的表。

PostgreSQL相关知识概念的更多相关文章

  1. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

    本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...

  2. Golang(十)TLS 相关知识(一)基本概念原理

    0. 前言 最近参与一个基于 BitTorrent 协议的 Docker 镜像分发加速插件的开发,主要参与补充 https 协议 学习了 TLS 相关知识,下面对之前的学习做一下简单总结 参考文献:T ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  5. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  6. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

  7. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  8. 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识

    从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...

  9. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

随机推荐

  1. Oracle中分割逗号函数REGEXP_SUBSTR

    最近优化FORM中的查询条件遇到某个字段可以选取多个值的问题,思路当然就是选取时将多个值通过某个符号拼接起来,查询数据的时候将拼接后的字符串按照符号分割开,在分割逗号的时候用到了一个新的方法REGEX ...

  2. jquery总结和注意事项

    1.关于页面元素的引用通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom ...

  3. js - 日期、时间 Date对象方法

    Date 是 JS 内置的日期构造函数 var d = new Date();  // 这个是系统当前时间的日期实例 d.getYear(); // 返回 d 实例年份 - 1900 d.getFul ...

  4. Mysql资料 主键

    目录 一.简介 二.操作 三.技巧 一.简介 主键意味着表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保 ...

  5. 降低制作门槛,人人都是3D“模”术师

    12月14日,HDD(Huawei Developer Day)深圳站圆满举办.国内3D扫描类开发团队看书击水为大家分享了与HMS Core 3D建模服务的合作之旅,讲述了如何通过3D物体建模能力为其 ...

  6. Markdown 语法粗学

    Markdown 语法粗学 Typora下载 Typora官网 下拉点击右上角 选择下载即可 里面选择自己想要的系统下载即可 如果下载缓慢,推荐使用各自的下载工具或者使用软件管家等 亲测迅雷速度尚可 ...

  7. [HarekazeCTF2019]baby_rop

    看到名字就想到了用rop来做这道题 老样子chescksec和file一下 可以看到是64位的程序开启了nx保护,把程序放到idax64里 可以看到有system和/bin/sh,/bin/sh无法跟 ...

  8. 解决pwn题目加载指定libc版本的问题

    因为本地和远程的libc版本不同,pwn题目调试起来会有影响,所以来记录一下用patchelf和glibc-all-in-one来解决这个问题过程. 下载工具 下载patchelfgit clone ...

  9. BJD4th pwn pi

    没记错的话,比赛那天正好是圣诞节,就只看了这一道pwn题,我还没做出来.我太菜了. 有一说一,ida换成7.5版本之后,一些去掉符号表的函数也能被识别出来了,ida更好用了呢. 题目程序分为两块,先看 ...

  10. LuoguP1898 缘分计算 题解

    Content 根据一个长度为 \(l\),只含大写字母的字符串算出它的"缘分值". 步骤如下: 给定一个数 \(st\). 将字符串里面的所有字母改成数字(如 A 改成 \(st ...