【PG】PostgreSQL 模式(Schema)

这篇具有很好参考价值的文章主要介绍了【PG】PostgreSQL 模式(Schema)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 Schema的概念

database schema table之间的关系 

引入schema的原因

创建Schema

查看Schema

删除Schema

2 Public Schema

3 Schema的索索路径

4 Schema 与 权限

5 系统Catalog Schema

6 使用方式(最佳实践)

7 可移植性


1 Schema的概念

一个PostgreSQL数据库集群中包含一个或更多的数据库。 角色和一些其他对象类型被整个集群共享,连接到服务器的客户端只能访问单个数据库中的数据,在连接请求中指定的那一个。

一个数据库包含一个或多个模式,模式中包含着表。模式还包含其他类型的命名对象,包括数据类型、函数和操作符。相同的对象名称可以被用于不同的模式中而不会出现冲突,例如schema1myschema都可以包含名为mytable的表。和数据库不同,模式并不是被严格地隔离:一个用户可以访问他们所连接的数据库中的所有模式内的对象,只要他们有足够的权限。

重点:

cluster可以包含多个database ,每个database可以包含多个schema,schema中包含table和其他对象

database schema table之间的关系 

database
每个PG服务可以包含多个独立的database

schema
如果把databases比作一个国家,那么schema就是一些独立的省。大多数对象是隶属于某个schema的,然后schema又隶属于某个databases。在创建一个新的database时,PG会自动为其创建一个名为public的schema。如果未设置searc_path变量,那么PG会将你创建的所有对象默认放入public schema中。如果表的数量较少,这是没问题的,但是如果你有几千张表,那么我们还是建议你将他们分门别类放入不同的schema中。


任何一个数据库中,表都是最核心的对象类型。在PG中,表首先属于某个schema,而schema有属于某个database,这样就构成一种三级存储结构。PG的表支持两种很强大的功能。第一种是继承,即一张表可以有父表和子表,这种层次化的结构可以极大的简化数据库设计,还可以为你省掉大量的重复查询代码。第二种是创建一张表的同时,系统会自动为此表创建一种对应的自定义数据类型。
 

psql 切换schema,PostgreSQL,postgresql

引入schema的原因

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 将数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

创建Schema

# 切换到db3数据库
postgres=# \c db3
You are now connected to database "db3" as user "postgres".
db3=#

# 创建schema
db3=# create SCHEMA myschema;
CREATE SCHEMA


# 在myschema中创建表cities
CREATE TABLE db3.myschema.cities (
    name            varchar(80),
    location        point
);


# 创建一个由其他人所拥有的模式(因为这是将用户动作限制在良定义的名字空间中的方法之一)。其语法是:
db3=# CREATE SCHEMA myschema3 AUTHORIZATION role3;
CREATE SCHEMA
db3=#
db3=#
db3=# \dn
   List of schemas
   Name    |  Owner
-----------+----------
 myschema  | postgres
 myschema2 | postgres
 myschema3 | role3
 public    | postgres
(4 rows)


查看Schema

db3=# \dn
   List of schemas
   Name    |  Owner
-----------+----------
 myschema  | postgres
 myschema2 | postgres
 public    | postgres
(3 rows)

删除Schema

# 删除不为空的schema会报错

db3=# drop schema myschema;
ERROR:  cannot drop schema myschema because other objects depend on it
DETAIL:  table cities depends on schema myschema
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

# 要删除一个模式以及其中包含的所有对象,可用

db3=# DROP SCHEMA myschema CASCADE;
NOTICE:  drop cascades to table cities
DROP SCHEMA

2 Public Schema

创建的表如果不指定任何schema名称。默认情况下这些表(以及其他对象)会自动的被放入一个名为“public”的schema中。任何新数据库都包含这样一个模式。因此,下面的命令是等效的:

CREATE TABLE products ( ... );
CREATE TABLE public.products ( ... );

3 Schema的索索路径

搜索路径中的第一个schema被称为当前schema。除了是第一个被搜索的schema外,如果CREATE TABLE命令没有指定schema名,它将是新创建表所在的schema。

# 显示当前的搜索路径
db3=# SHOW search_path;
   search_path
-----------------
 "$user", public
(1 row)


第一个元素说明一个和当前用户同名的schema会被搜索。如果不存在这个schema,该项将被忽略。第二个元素指向我们已经见过的public schema。

搜索路径中的第一个模式是创建新对象的默认存储位置。这就是默认情况下对象会被创建在公共模式中的原因。当对象在任何其他没有模式限定的环境中被引用(表修改、数据修改或查询命令)时,搜索路径将被遍历直到一个匹配对象被找到。因此,在默认配置中,任何非限定访问将只能指向公共模式。

# 修改搜索路径
SET search_path TO myschema,public;

SET search_path TO myschema;

4 Schema 与 权限

5 系统Catalog Schema

public和用户创建的模式之外,每一个数据库还包括一个pg_catalog模式,它包含了系统表和所有内建的数据类型、函数以及操作符pg_catalog总是搜索路径的一个有效部分。如果没有在路径中显式地包括该模式,它将在路径中的模式 之前 被搜索。这保证了内建的名称总是能被找到。然而,如果我们希望用用户定义的名称重载内建的名称,可以显式的将pg_catalog放在搜索路径的末尾。

由于系统表名称以pg_开头,最好还是避免使用这样的名称,以避免和未来新版本中可能出现的系统表名发生冲突。系统表将继续采用以pg_开头的方式,这样它们不会 与非限制的用户表名称冲突。

6 使用方式(最佳实践)

模式能够以多种方式组织数据。一个安全模式使用方式可以防止不受信任的用户更改其他用户的查询行为。当数据库没有使用安全模式使用方式时,希望安全地查询该数据库的用户将在每个会话开始时采取保护操作。具体的说,他们开始会话前会设置search_path为空字符串,或者删除search_path中非超级用户可写的模式。以下的一些使用方式在默认配置下可以很容易实现。

  • 将普通用户约束在其私有的方案中。要实现这一点,执行REVOKE CREATE ON SCHEMA public FROM PUBLIC,并且为每一个用户创建一个用其用户名命名的模式。回想一下,默认搜索路径开头的$user会解析为用户名。因此,如果每个用户都有单独的模式,则默认情况下他们访问自己的模式。在不受信任的用户已经登录的数据库中采用此使用方式后,请考虑检查公共模式中名字与模式pg_catalog中对象相类似的对象。此方式是一种安全模式的使用方式,除非不受信任的用户是数据库所有者或拥有CREATEROLE权限,在这种情况下将不存在没有安全模式使用方式。

  • 从默认搜索路径中删除公共模式,通过修改postgresql.conf或执行ALTER ROLE ALL SET search_path ="$user"。每一个角色都仍然保留在公共模式中创建对象的能力,但是只有符合的名称才会选择到这些对象。虽然符合的的表引用是安全的,但是调用公共模式中的函数会是不安全或不可靠的。如果要在公共模式中创建函数或扩展,请改用第一个方式。否则,与第一个使用方式一样,这是安全的,除非不受信任的用户是数据库所有者或拥有CREATEROLE权限。

  • 保持默认。所有用户都隐式地访问公共模式。这模拟了根本没有使用模式的情况,可以用于从无模式的世界平滑过渡。但是,这绝不是一个安全的使用方式。只有当数据库仅有单个用户或者少数相互信任的用户时,才可以接受。

对于任何一种模式,如果要安装共享的应用(所有人都要用的表、第三方提供的额外函数,等等),可把它们放在单独的模式中。记得授予适当的权限以允许其他用户访问它们。然后用户可以通过以模式名限定名称的方式来引用这些额外的对象,或者他们可以把额外的模式放在自己的搜索路径中。文章来源地址https://www.toymoban.com/news/detail-755167.html

7 可移植性

到了这里,关于【PG】PostgreSQL 模式(Schema)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pg mysql oracle 中的schema

    pg中的schema 表示当前db中数据库对象的命名空间(namespace),数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说,在第一次看到pg中的schema的概念时,可能会疑惑,schema不是表示database的吗? 注: mysql中schema和 database是一个概念。create database 和create sche

    2024年02月08日
    浏览(41)
  • POSTGRESQL PG15关于归档的新模式

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到3群(共810人左右 1 + 2 + 3),这里需要注意,如果想和 瑞典马工进行面对面的交

    2024年02月06日
    浏览(52)
  • postgresql(一):使用psql导入数据库

    大家好,我是欧阳方超。 听说postgresql越来越流行了?psql是一个功能强大的命令行工具,用于管理和操作PostgreSQL数据库。它提供了一个交互式环境,允许用户执行SQL查询、创建和管理数据库、执行备份和恢复等操作。今天把公司的pg库迁到Windows机器上,在使用psql命令的过程

    2024年02月12日
    浏览(51)
  • 【postgresql 基础入门】psql客户端的使用方法

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 初始化集群 数据库服务管理 psql客户端使用 postgresql 数据库是一款通用的关

    2024年02月09日
    浏览(46)
  • 数据库模式(schema)是什么?

    在数据库的术语中,模式(schema)是一个逻辑概念,用于组织数据库中的对象。模式中的对象通常包括表、索引、数据类型、序列、视图、存储过程、主键、外键等等。 模式可以为数据库对象提供逻辑隔离功能,不用应用程序可以使用各自的模式,实现安全的访问权限控制。

    2024年02月06日
    浏览(51)
  • 【PG】PostgreSQL字符集

    目录 设置字符集 1 设置集群默认的字符集编码 2 设置数据库的字符集编码 查看字符集 1 查看数据字符集编码  2 查看服务端字符集 3 查看客户端字符集 4 查看默认的排序规则和字符分类  被支持的字符集 PostgreSQL里面的字符集支持你能够以各种字符集存储文本,包括 单字节字

    2024年02月08日
    浏览(50)
  • PostgreSQL数据库连接报错:psql: error: FATAL: password authentication failed for user “postgres“

    环境如下,使用yum方式安装PostgreSQL hostname IP地址 操作系统版本 PostgreSQL版本 jeven 192.168.3.166 centos 7.6 13.10 PostgreSQL(经常被简称为Postgres)是一个开源的关系型数据库管理系统,它基于SQL语言实现了所有主流功能,支持事务处理、并发控制、复杂查询、外键、触发器、存储过程

    2024年02月04日
    浏览(61)
  • PostgreSql pg_ctl 命令

    控制 PostgreSQL 服务的工具。 init 或 initdb:调用initdb命令。详见initdb。 参数说明 : -c 或 --core-files :生成服务器崩溃产生核心文件。 -D datadir 或 --pgdata=datadir :指定数据库数据文件位置。如果这个选项被忽略,将使用环境变量 PGDATA。 -l filename 或 --log=filename :追加服务器日志

    2024年02月14日
    浏览(49)
  • Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 & 由于找不到文件libintl-9.dll等问题

    不知道是不是,笔者取消了 stack Builder 的安装,导致 psql 在 Windows 10 的cmd 命令下运行报错 \\\'psql\\\' 不是内部或外部命令,也不是可运行的程序或批处理文件。 ,配置了 pgAdmin 4 文件夹内的 runtime 环境变量也不行。所以笔者只能尝试重装 PostgreSQL 。 还有一个是手动点击 \\\"D:xxxpg

    2024年02月15日
    浏览(43)
  • 【PG】PostgreSQL客户端认证pg_hba.conf文件

    目录 文件格式  连接类型(TYPE) 数据库(database) 用户(user) 连接地址(address) 格式 IPv4 IPv6 字符 主机名 主机名后缀 IP-address/IP-mask auth-method trust reject scram-sha-256 md5 password gss sspi ident peer ldap radius cert pam bsd auth-options 示例 用户在连接到PG数据库之前首先要经过文件的验证,可以

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包