一个数据库包含一个或多个命名的模式,模式又包含表。模式还包含其它命名的对象,包括数据类型、函数,以及操作符。同一个对象名可以在不同的模式里使用而不会导致冲突; 比如,schema1和myschema都可以包含叫做mytable的表。和数据库不同,模式不是严格分离的:一个用户可以访问他所连接的数据库中的任意模式中的对象,只要他有权限。

我们需要模式有以下几个主要原因:

1). 允许多个用户使用一个数据库而不会干扰其它用户。

2). 把数据库对象组织成逻辑组,让它们更便于管理。

3). 第三方的应用可以放在不同的模式中,这样它们就不会和其它对象的名字冲突。

1. 创建模式:

CREATE SCHEMA myschema;

通过以上命令可以创建名字为myschema的模式,在该模式被创建后,其便可拥有自己的一组逻辑对象,如表、视图和函数等。

2. public模式:

在介绍后面的内容之前,这里我们需要先解释一下public模式。每当我们创建一个新的数据库时,PostgreSQL都会为我们自动创建该模式。当登录到该数据库时,如果没有特殊的指定,我们将以该模式(public)的形式操作各种数据对象,如:

CREATE TABLE products ( ... ) 等同于 CREATE TABLE public.products ( ... )

3. 权限:

缺省时,用户看不到模式中不属于他们所有的对象。为了让他们看得见,模式的所有者需要在模式上赋予USAGE权限。为了让用户使用模式中的对象,我们可能需要赋予额外的权限,只要是适合该对象的。PostgreSQL根据不同的对象提供了不同的权限类型,如:

GRANT ALL ON SCHEMA myschema TO public;

上面的ALL关键字将包含CREATE和USAGE两种权限。如果public模式拥有了myschema模式的CREATE权限,那么登录到该模式的用户将可以在myschema模式中创建任意对象,如:

CREATE TABLE myschema.products (

product_no integer,

name text,

price numeric CHECK (price > 0),

);

在为模式下的所有表赋予权限时,需要将权限拆分为各种不同的表操作,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema

GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO public;

在为模式下的所有Sequence序列对象赋予权限时,需要将权限拆分为各种不同的Sequence操作,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema

GRANT SELECT, UPDATE, USAGE ON SEQUENCES TO public;

在为模式下的所有函数赋予权限时,仅考虑执行权限,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema

GRANT EXECUTE ON FUNCTIONS TO public;

可以看出,通过以上方式在public模式下为myschema模式创建各种对象是极为不方便的。下面我们将要介绍另外一种方式,即通过role对象,直接登录并关联到myschema对象,之后便可以在myschema模式下直接创建各种所需的对象了。

CREATE ROLE myschema LOGIN PASSWORD '123456'; --创建了和该模式关联的角色对象。

CREATE SCHEMA myschema AUTHORIZATION myschema; --将该模式关联到指定的角色,模式名和角色名可以不相等。

在Linux Shell下,以myschema的角色登录到数据库MyTest,在密码输入正确后将成功登录到该数据库。

/> psql -d MyTest -U myschema

Password:

MyTest=> CREATE TABLE test(i integer);

CREATE TABLE

MyTest=> \d   --查看该模式下,以及该模式有权限看到的tables信息列表。

List of relations

Schema     |   Name   | Type  |  Owner

------------+---------+------+----------

myschema |   test     | table  | myschema

(1 rows)

4. 删除模式:

DROP SCHEMA myschema;

如果要删除模式及其所有对象,请使用级联删除:

DROP SCHEMA myschema CASCADE;

5. 模式搜索路径:

我们在使用一个数据库对象时可以使用它的全称来定位对象,然而这样做往往也是非常繁琐的,每次都不得不键入owner_name.object_name。PostgreSQL中提供了模式搜索路径,这有些类似于Linux中的$PATH环境变量,当我们执行一个Shell命令时,只有该命令位于$PATH的目录列表中,我们才可以通过命令名直接执行,否则就需要输入它的全路径名。PostgreSQL同样也通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中 没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。

在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外,它还是在CREATE TABLE没有声明模式名的时候,新建表所属于的模式。要显示当前搜索路径,使用下面的命令:

MyTest=> SHOW search_path;

search_path

----------------

"$user",public

(1 row)

可以将新模式加入到搜索路径中,如:

SET search_path TO myschema,public;

为搜索路径设置指定的模式,如:

SET search_path TO myschema; --当前搜索路径中将只是包含myschema一种模式。

psql切换schema_PostgreSQL教程(二):模式Schema详解相关推荐

  1. Unified Functional Testing(UFT)15.0.2入门保姆级教程(二),图文详解。QTP

    UFT入门之验证点和参数化 UFT15.0.2教程之侦测器(ObjectSpy)及脚本录制 请移步:Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文 ...

  2. Kafka单机、集群模式安装详解(二)

    本文环境如下: 操作系统:CentOS 6 32位 JDK版本:1.8.0_77 32位 Kafka版本:0.9.0.1(Scala 2.11) 接上篇 Kafka单机.集群模式安装详解(一) 6. ...

  3. AndroidManifest.xml文件配置教程及相关指令详解

    AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...

  4. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  5. java正则表达式 匹配次数_正则表达式教程之重复匹配详解

    本文实例讲述了正则表达式教程之重复匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法 ...

  6. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  7. MYSQL performance schema详解

    MYSQL performance schema详解 0.performance_schema的介绍 ​ MySQL的performance schema 用于监控MySQL server在一个较低级 ...

  8. CentOS下Hive2.0.0集群模式安装详解

    本文环境如下: 操作系统:CentOS 6 32位 Hive版本:2.0.0 JDK版本:1.8.0_77 32位 Hadoop版本:2.6.4 MySQL版本:5.6.30 1. 准备工作 1.1 ...

  9. java 组合对象_Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 ...

最新文章

  1. python绘制正态分布函数_学好正态分布有多重要?
  2. 请写出至少五个块级元素_html 行级元素和块级元素标签列表分别有哪些
  3. 洛谷P4292:重建计划(点分治、单调队列)
  4. 【转载 | 笔记】IIS无法删除应该程序池 因为它包含X个应用程序
  5. 懒汉式(线程安全,同步代码块儿)
  6. 使用XLocalizer进行ASP.NET Core本地化
  7. Android Studio(五):修改Android Studio项目包名
  8. leetcode 77.组合 dfs解法
  9. Google Home其实是个错误
  10. php 递归穿件文件夹,PHP递归复制整个文件夹
  11. 中科院分词系统整理笔记
  12. 肿瘤异质性:精准医学需要解决的难题
  13. 外卖返利微信小程序源码
  14. 金融套利策略:理解统计套利的工作原理
  15. Hash破解神器-hashcat详细使用
  16. 一个虎扑社区数据分析实战
  17. Tiled map导入问题
  18. HashMap 底层源码详解(jdk1.8)
  19. 设计模式中的工厂类图
  20. 计算机应用论文经验总结,计算机应用基础总结论文

热门文章

  1. 洛谷 2759 奇怪的函数
  2. shell基础05 处理用户输入
  3. 02-css的选择器
  4. asp.net下用js实现弹出子窗口选定值并返回
  5. Andorid获取状态栏高度
  6. WPF RichTextBox相关总结
  7. Android Training精要(六)如何防止Bitmap对象出现OOM
  8. 算法导论13-1节习题解答
  9. C++之运算符重载(下)
  10. 根据 设备名(br0/eth0/em0)称获取 当前机器的IP地址与子网掩码信息