PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

2023-05-16


看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?
经过中午的一个小实验,我逐渐理清了个中来龙去脉。下面我来还原我的试验,并循序讲清其中关系。

 

首先,实验出角色与用户的关系
    在PostgreSQL中,存在两个容易混淆的概念:角色/用户。之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象。唯一的区别是在创建的时候:
 1.我用下面的psql创建了角色kanon:
   CREATE ROLE kanon PASSWORD 'kanon';
   接着我使用新创建的角色kanon登录,PostgreSQL给出拒绝信息:

   FATAL: role 'kanon' is not permitted to log in.
   说明该角色没有登录权限,系统拒绝其登录。 
 2.我又使用下面的psql创建了用户kanon2:
   CREATE USER kanon PASSWORD 'kanon2';
   接着我使用kanon2登录,登录成功。
   难道这两者有区别吗?查看文档,又这么一段说明:"CREATE USER is the same as CREATE ROLE except that it implies LOGIN."----CREATE USER除了默认具有LOGIN权限之外,其他与CREATE ROLE是完全相同的。
   为了验证这句话,修改kanon的权限,增加LOGIN权限:ALTER ROLE kanon LOGIN;再次用kanon登录,成功!
   那么,事情就明了了:CREATE ROLE kanon PASSWORD 'kanon' LOGIN 等同于CREATE USER kanon PASSWORD 'kanon'.
   这就是ROLE/USER的区别。

 

然后,数据库与模式的关系
    看文档了解到:模式(schema)是对数据库(database)逻辑分割。
在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式。所有为此数据库创建的对象(表、函数、试图、索引、序列等)都是常见在这个模式中的。
 实验如下:
 1.创建一个数据库dbtt----CREATE DATABASE dbtt;
 2.用kanon角色登录到dbtt数据库,查看dbtt数据库中的所有模式:/dn; 显示结果是只有public一个模式。
 3.创建一张测试表----CREATE TABLE test(id integer not null);
 4.查看当前数据库的列表: /d; 显示结果是表test属于模式public.也就是test表被默认创建在了public模式中。
 5.创建一个新模式kanon,对应于登录用户kanon:CREATE SCHEMA kanon OWNER kanon;
 6.再次创建一张test表,这次这张表要指明模式----CREATE TABLE kanon.test (id integer not null);
 7.查看当前数据库的列表: /d; 显示结果是表test属于模式kanon.也就是这个test表被创建在了kanon模式中。
   得 出结论是:数据库是被模式(schema)来切分的,一个数据库至少有一个模式,所有数据库内部的对象(object)是被创建于模式的。用户登录到系 统,连接到一个数据库后,是通过该数据库的search_path来寻找schema的搜索顺序,可以通过命令SHOW search_path;具体的顺序,也可以通过SET search_path TO 'schema_name'来修改顺序。
   官方建议是这样的:在管理员创建一个具体数据库后,应该为所有可以连接到该数据库的用户分别创建一个与用户名相同的模式,然后,将search_path设置为"$user",
   这样,任何当某个用户连接上来后,会默认将查找或者定义的对象都定位到与之同名的模式中。这是一个好的设计架构。

 

接下来,再来研究下表空间与数据库的关系
    数据库创建语句CREATE DATABASE dbname 默认的数据库所有者是当前创建数据库的角色,默认的表空间是系统的默认表空间--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 OWNER kanon TEMPLATE template1 TABLESPACE tablespacename; 
    下面我们来做个实验验证一下:
 1.连接到template1数据库,创建一个表作为标记:CREATE TABLE tbl_flag(id integer not null);向表中插入数据INSERT INTO tbl_flag VALUES (1);
 2.创建一个表空间:CREATE TABLESPACE tskanon OWNER kanon LOCATION '/tmp/data/tskanon';在此之前应该确保目录/tmp/data/tskanon存在,并且目录为空。
 3.创建一个数据库,指明该数据库的表空间是刚刚创建的tskanon:CREATE DATABASE dbkanon TEMPLATE template1 OWNERE kanon TABLESPACE tskanon;
 4.查看系统中所有数据库的信息:/l;可以发现,dbkanon数据库的表空间是tskanon,拥有者是kanon;
 5.连接到dbkanon数据库,查看所有表结构:/d;可以发现,在刚创建的数据库中居然有了一个表tbl_flag,查看该表数据,输出结果一行一列,其值为1,说明,该数据库的确是从template1克隆而来。

 仔细分析后,不难得出结论:在PostgreSQL中,表空间是一个目录,里面存储的是它所包含的数据库的各种物理文件。

 

最后,我们回头来总结一下这张关系网
    表空间是一个存储区域,在一个表空间中可以存储多个数据库,尽管PostgreSQL不建议这么做,但我们这么做完全可行。
    一个数据库并不知直接存储表结构等对象的,而是在数据库中逻辑创建了至少一个模式,在模式中创建了表等对象,将不同的模式指派该不同的角色,可以实现权限 分离,又可以通过授权,实现模式间对象的共享,并且,还有一个特点就是:public模式可以存储大家都需要访问的对象。
    这样,我们的网就形成了。可是,既然一个表在创建的时候可以指定表空间,那么,是否可以给一个表指定它所在的数据库表空间之外的表空间呢?
    答案是肯定的!这么做完全可以:那这不是违背了表属于模式,而模式属于数据库,数据库最终存在于指定表空间这个网的模型了吗?!
    是的,看上去这确实是不合常理的,但这么做又是有它的道理的,而且现实中,我们往往需要这么做:将表的数据存在一个较慢的磁盘上的表空间,而将表的索引存在于一个快速的磁盘上的表空间。
    但我们再查看表所属的模式还是没变的,它依然属于指定的模式。所以这并不违反常理。实际上,PostgreSQL并没有限制一张表必须属于某个特定的表空间,我们之所以会这么认为,是因为在关系递进时,偷换了一个概念:模式是逻辑存在的,它不受表空间的限制。

 

----

本文为转载:http://blog.csdn.net/kanon_lgt/article/details/5931522

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系 的相关文章

随机推荐

  • gitbash执行不了npm scripts命令

    git bash执行npm scripts中的命令会直接报错 node 不是内部或外部命令 xff0c 也不是可运行的程序 我的解决办法是执行以下命令即可 xff1a npm config set script span class tok
  • vue/multi-word-component-names

    解决方法一 xff1a vue config js中添加一行 xff08 这种方式试完还是有报错显示 xff0c 但是项目可以运行 xff09 span class token keyword const span span class t
  • 将sql文件导入数据库时,报错Data truncated for column

    解决办法 打开my span class token operator span ini配置文件 将sql model中的 span class token constant STRICT TRANS TABLES span 去掉
  • HTTP响应码&接口定义

    span class token number 100 span span class token operator 61 span span class token operator gt span 39 span class token
  • 3.1AP_HAL(APM的硬件抽象层)

    前言 前段时间梳理了PX4IO以及PX4FMU的类 xff0c 但是还是没真正上去梳理到硬件框架上去 xff0c 这次直接开始梳理AP HAL框架 xff0c 从根本上去认识pixhawk在硬件框架上的实现 xff1b namespace
  • vue-element-admin执行npm install时的一些报错。

    文章目录 1 首先在gitee上拉取的中文版2 执行npm install的一些报错3 参考文章 1 首先在gitee上拉取的中文版 git clone b i18n https gitee com panjiachen vue eleme
  • vue-element-admin 代码格式化问题

    本地clone了vue element admin项目 xff0c 但是前端两个空格的缩进看着很不爽 xff0c 为了解决这个问题 xff0c 可以进行如下操作 首先我本地vscode使用的是prettier格式化 xff0c pretti
  • MySQL批量插入指定位数的随机数并且可以指定条数。

    SQL脚本 xff1a span class token comment 首先创建一个生成随机位数的函数 span span class token keyword DELIMITER span span class token keywo
  • php usort函数解析

    语法 usort array amp array callable cmp function bool 执行过程 usort函数调用自定义的排序函数对数组进行排序 排序函数会比较数组中的两个元素 xff0c 并返回它们的大小关系 usort
  • 如何在一台windows主机上搭建mysql主从配置

    转自 xff1a http www cnblogs com yuechaotian archive 2013 05 15 3080056 html 1 首先要在本地建立两个mysql服务 xff08 首先正常使用安装包安装第一个 xff0c
  • php设计模式

    php 设计模式 转自 https www cnblogs com siqi archive 2012 09 09 2667562 html 1 单例模式 单例模式顾名思义 xff0c 就是只有一个实例 作为对象的创建模式 xff0c 单例
  • PHP八大设计模式

    PHP命名空间 转自http blog csdn net flitrue article details 52614599 reload 可以更好地组织代码 xff0c 与Java中的包类似 Test1 php span class php
  • DataTables 详细设置(1)

    转自http blog csdn net arsiya jerry article details 50505294 并不是所有的后台开发都有美工和前端工程师来配合做页面 xff0c 为了显示数据并有一定的美感 xff0c jQuery的D
  • dataTables-使用详细说明整理

    转自 http blog csdn net mickey miki article details 8240477 本文共四部分 xff1a 官网 基本使用 遇到的问题 属性表 一 xff1a 官方网站 xff1a http www dat
  • 关于Xshell过期,需要采购问题

    1 卸载电脑中过期的xshell 2 http www netsarang com download free license html 去官网下载免费版 Home amp School 家庭和学校版本 注意邮箱要填写正确 填写完提交后会收
  • genromfs的使用及nuttx下romfs制作

    61 61 61 61 61 gt 我的博客目录导航 前言 这篇文章仅仅是为了记录如何使用genromfs制作romfs然后在nuttx上直接应用 xff0c 不会去详细介绍romfs的一系列特性 genromfs 首先去下载genromf
  • STM32智能小车系列教程(一)小车介绍及基本搭建

    大家收到小车包裹后 xff0c 想必都已经跃跃欲试了 xff0c 接下来关注我们的系列教程 xff0c 教你从零搭建一辆STM32F103智能小车 xff0c 本教程面向零基础 xff08 当然基本的单片机知识和C语言知识还是需要具备的 x
  • PHP上传图片 (从html到JS再到php onclick方式提交)

    1 首先form表单必须是post方式提交 xff0c 并且含有enctype 61 34 multipart form data 34 属性 如图 2 JS代码 利用formdata接收html中form表单的数据 利用append将其他
  • MongoDB Windows系统各个64位版本下载地址: http://dl.mongodb.org/dl/win32/x86_64

    MongoDB Windows系统各个64位版本下载地址 xff1a http dl mongodb org dl win32 x86 64
  • PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

    看PostgreSQL9的官方文档 xff0c 我越看越迷糊 xff0c 这表空间 xff0c 数据库 xff0c 模式 xff0c 表 xff0c 用户 xff0c 角色之间的关系怎么在PostgreSQL里这么混乱呢 xff1f 经过中