https://www.cnblogs.com/abclife/p/13905336.html

postgresql中,用户创建的所有对象都被创建在指定的schema(或namespace)中。其他用户可能拥有、也可能不拥有访问这些对象的权限,甚至都不可以在对应的schema中创建对象。

从上面的表可以看出,用户(或角色)是全局对象,不是定义在数据库中,而是定义在实例的级别。schema是用户在指定的数据库中创建的,其中包含数据库对象。

可能有人对下面的操作感到困惑:

1
2
3
4
5
6
7
$ psql
psql (11.9)
Type "help" for help.
 
postgres=# create table t1(a int);
CREATE TABLE
postgres=#

在这个创建表的语句中,并没有指定schema。那这些表会在哪里呢?

每个postgresql数据库默认都有一个public schema,如果没有为对象显式地指定schema,新创建的对象就是放在public schema中。有几种方式可以查看给定的表是属于哪个schema,但是最常用的主要有两种:1.查看系统目录视图;2.使用psql短命令

1
2
3
4
5
6
7
8
9
10
11
12
13
postgres=# select schemaname from pg_tables where tablename ='t1';
 schemaname
------------
 public
(1 rows)
 
postgres=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           |          |
 
postgres=#

在postgresql中,public schema是一个特殊的schema,你要么移除该schema,要么收回在public schema上授予给public的权限。

当你删除了public schema后尝试创建一个表,会发生什么呢?

1
2
3
4
5
6
7
8
postgres=# drop schema public cascade;
NOTICE:  drop cascades to table t1
DROP SCHEMA
postgres=# create table t1 ( a int );
ERROR:  no schema has been selected to create in
LINE 1: create table t1 ( a int );
                     ^
postgres=#

  

我们现在没有schema了:

1
2
3
4
5
postgres=# \dn
List of schemas
 Name | Owner
------+-------
(0 rows)

postgresql不知道去哪里创建表。这里也可以看出,在postgresql中schema和user是不同的了。我们是以postgres用户登录,但是没有schema可以创建对象。

现在,我们来创建一个schema:

1
2
3
4
5
6
7
postgres=# create schema my_schema;
CREATE SCHEMA
postgres=# create table t1(a int);
ERROR:  no schema has been selected to create in
LINE 1: create table t1(a int);
                     ^
postgres=#

仍然不可以创建表。这里可能会问:为什么有public schema就可以呢?在上面的演示中我们并没有指定public schema呀!这里就需要提到参数search_path了:

1
2
3
4
5
6
7
postgres=# show search_path;
   search_path  
-----------------
 "$user"public
(1 row)
 
postgres=#

缺省情况下,search_path包含当前用户名和public。所以会创建失败。

有两种方式来解决:

1
2
3
4
5
6
7
postgres=# create table my_schema.t1 ( a int );
CREATE TABLE
postgres=# \d my_schema.t1
               Table "my_schema.t1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           |          |

或者调整search_path的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
postgres =  # set search_path = 'my_schema',"$user",public;
SET
postgres =  # show search_path ;
search_path
----------------------------
my_schema, "$user"public
(1 row)
 
postgres =  # create table t2 ( a int );
CREATE TABLE
postgres =  # \d t2
                Table "my_schema.t2"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           |          |
 
postgres =  #

[转帖]PostgreSQL中的schema和user的更多相关文章

  1. PostgreSQL 中定义自己需要的数据类型

    PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...

  2. 在PostgreSQL中使用oracle_fdw访问Oracle

    本文讲述如何在PostgreSQL中使用oracle_fdw访问Oracle上的数据. 1. 安装oracle_fdw 可以参照:oracle_fdw in github 编译安装oracle_fdw ...

  3. PostgreSQL学习----模式schema

    PostgreSQL学习---模式schema 小序 接触PostgreSQL也有好长时间了,知识不总结梳理,似乎总不是自己的,继续努力吧少年!以此记录我的软件工艺之路! 模式(Schema) 一个 ...

  4. PostgreSQL中定时job执行(pgAgent)

    PostgreSQL中定时job执行 业务分析 近期项目需要定期清理数据库中的多余数据,即每月1号删除指定表中一年以上的数据. 初步分析这种定时job可以使用一下两种技术实现: Linux的cront ...

  5. [转帖]PostgreSQL的用户、角色和权限管理

    PostgreSQL的用户.角色和权限管理 2018年05月18日 14:02:29 jerry-89 阅读数 6143 https://blog.csdn.net/eagle89/article/d ...

  6. [转帖]PostgreSQL与MySQL比较 From 2010年

    PostgreSQL与MySQL比较 [复制链接]  http://bbs.chinaunix.net/thread-1688208-1-1.html osdba 稍有积蓄 好友 博客 消息 论坛徽章 ...

  7. 在PostgreSQL中 pg_start_backup 做了什么?

    # 在PostgreSQL中 pg_start_backup 做了什么?HM 2019-07-30 ## pg_start_backup 做一个备份开始标记,还做了一些其他的操作,下面进行探寻. * ...

  8. PostgreSQL 模式(SCHEMA)

    PostgreSQL 模式(SCHEMA)可以看着是一个表的集合. 一个模式可以包含视图.索引.据类型.函数和操作符等. 相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 ...

  9. 通过arcgis在PostgreSQL中创建企业级地理数据库

    部署环境: Win7 64位旗舰版 软件版本: PostgreSQL-9.1.3-2-windows-x64 Postgis-pg91x64-setup-2.0.6-1 Arcgis 10.1 SP1 ...

  10. PostgreSQL 中日期类型转换与变量使用及相关问题

    PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...

随机推荐

  1. 开发篇1:使用原生api和Langchain调用大模型

    对大模型的调用通常有以下几种方式:方式一.大模型厂商都会定义http风格的请求接口,在代码中可以直接发起http请求调用:方式二.在开发环境中使用大模型厂商提供的api:方式三.使用开发框架Langc ...

  2. Ynoi

    P4688 [Ynoi2016] 掉进兔子洞 序列,静态,求三个区间的可重集的交的大小,离线,\(n,Q\le 10^5\),3s,500MB 缺乏性质 \(\rightarrow\) bitset ...

  3. 论文解读:ACL2021 NER | 基于模板的BART命名实体识别

    摘要:本文是对ACL2021 NER 基于模板的BART命名实体识别这一论文工作进行初步解读. 本文分享自华为云社区<ACL2021 NER | 基于模板的BART命名实体识别>,作者: ...

  4. 顶级加密混淆混淆工具测评:ipagurd

    ​ 顶级加密混淆混淆工具测评:ipagurd 摘要 JavaScript代码安全需求日益增长,因此JavaScript混淆工具的使用变得广泛.本文将对专业.商业JavaScript混淆工具ipagur ...

  5. 利用 Solon-web 框架写一个 Hello World

    Solon 项目的开源地址: https://gitee.com/noear/solon 最近看了不少别人写的各种框架的 Hello world 示例,有些看起来,真的很复杂. 今天,我们用号称简单到 ...

  6. PPT 版面的规则和精髓

    排版四原则 对齐 对比 亲密 重复 背景图 案例

  7. PPT 表格设计

    顶级商业图表在哪找 https://www.mckinsey.com.cn/ 麦肯锡 图表 https://www.cbnweek.com 第一财经 https://data.163.com/ DAT ...

  8. 使用nginx代理emqx的TCP、WS、WSS连接请求

    项目代理关系: 注:主机上已存在名为:nginx-proxy 的一级 nginx 的代理,将监听了主机的 80.443端口 docker-compose.yml version: "3.7& ...

  9. 为什么 Go 和 Rust 语言都舍弃了继承?

    为什么go和rust语言都舍弃了继承? 舍弃了 Class 舍弃或弱化子类型 类的继承是一段儿弯路 OO 发明了继承,然后发现真正有意义的是 interface 的组合(更准确的说,是 Product ...

  10. Codeforce :466C. Number of Ways (数学)

    https://codeforces.com/problemset/problem/466/C 解题说明:此题是一道数学题,若平分分成若干种情况,应当整体(sum)考虑,对sum/3进行分析.它是区分 ...