当前位置: 首页 > news >正文

【PostgreSQL】模式Schema

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

数据库包含一个或多个命名schema,而这些schema又包含表。schema还包含其他类型的命名对象,包括数据类型、函数和运算符。相同的对象名称可以在不同的架构中使用而不会发生冲突;例如,both 和myschema可以包含名为mytable的表。与数据库不同,架构不是严格分离的:如果用户具有访问权限,则可以访问他们所连接到的数据库中任何架构中的对象。

可能想要使用架构的原因有以下几个:

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

  • 将数据库对象组织到逻辑组中,使其更易于管理。

  • 第三方应用程序可以放入单独的架构中,以便它们不会与其他对象的名称发生冲突。

架构类似于操作系统级别的目录,只是架构不能嵌套。

创建模式

要创建模式,请使用 CREATE SCHEMA 命令。为架构指定您选择的名称。例如:

CREATE SCHEMA myschema;

若要在架构中创建或访问对象,请编写一个由架构名称和表名称组成的限定名称,并用点分隔:

schema.table

这适用于需要表名的任何位置,包括表修改命令和以下章节中讨论的数据访问命令。(为简洁起见,我们只讨论表,但同样的想法也适用于其他类型的命名对象,例如类型和函数。

实际上,更通用的语法

database.schema.table

也可以使用,但目前这只是为了形式上符合 SQL 标准。如果写入数据库名称,则该名称必须与连接到的数据库相同。

因此,若要在新架构中创建表,请使用:

CREATE TABLE myschema.mytable (...
);

若要删除架构(如果架构为空)(其中的所有对象都已删除),请使用:

DROP SCHEMA myschema;

若要删除包含所有包含对象的架构,请使用:

DROP SCHEMA myschema CASCADE;

通常,您需要创建其他人拥有的架构(因为这是将用户的活动限制在定义明确的命名空间中的方法之一)。其语法为:

CREATE SCHEMA schema_name AUTHORIZATION user_name;

您甚至可以省略架构名称,在这种情况下,架构名称将与用户名相同。参见第 5.9.6 节了解它如何有用。

以pg_开头的架构名称保留用于系统目的,用户无法创建。

公共模式

在前面的部分中,我们在未指定任何架构名称的情况下创建了表。默认情况下,此类表(和其他对象)会自动放入名为“public”的架构中。每个新数据库都包含这样的架构。因此,以下内容是等效的:

CREATE TABLE products ( ... );

和:

CREATE TABLE public.products ( ... );

模式搜索路径

限定名称的编写起来很繁琐,通常最好不要将特定的架构名称连接到应用程序中。因此,表通常由非限定名称引用,这些名称仅由表名称组成。系统通过遵循搜索路径(要查找的架构列表)来确定哪个表。搜索路径中的第一个匹配表被视为所需的表。如果搜索路径中没有匹配项,则会报告错误,即使数据库中的其他架构中存在匹配的表名也是如此。

在不同架构中创建同名对象的能力使编写每次都引用完全相同对象的查询变得复杂。它还为用户提供了恶意或意外更改其他用户查询行为的可能性。由于查询中普遍存在非限定名称及其在 PostgreSQL 内部中的使用,因此添加架构以有效地信任对该架构具有权限的所有用户。当您运行普通查询search_path时,能够在搜索路径的架构中创建对象的恶意用户可以控制并执行任意 SQL 函数,就像您执行了CREATE一样。

搜索路径中命名的第一个架构称为当前架构。除了是第一个搜索的架构之外,它还是在命令未指定schema名称时将在其中创建新表CREATE TABLE的schema。

若要显示当前搜索路径,请使用以下命令:

SHOW search_path;

在默认设置中,这将返回:

 search_path
--------------"$user", public

第一个元素指定要搜索与当前用户同名的架构。如果不存在此类架构,则忽略该条目。第二个元素指的是我们已经看到的公共架构。

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

为了将我们的新架构放在路径中,我们使用:

SET search_path TO myschema,public;

(我们省略了此处,因为我们没有立即需要它。然后,我们可以在没有模式限定的情况下访问该表:$user

DROP TABLE mytable;

此外,由于是路径中的第一个元素,因此默认情况下将在其中创建新对象。myschema

我们也可以这样写:

SET search_path TO myschema;

这样,如果没有显式限定,我们就无法再访问公共架构。公共架构没有什么特别之处,只是它默认存在。它也可以被丢弃。

数据类型名称、函数名称和运算符名称的搜索路径的工作方式与表名称的搜索路径相同。数据类型和函数名称可以采用与表名称完全相同的方式限定。如果需要在表达式中写入限定的运算符名称,则有一项特殊规定:必须将

OPERATOR(schema.operator)

这是避免语法歧义所必需的。例如:

SELECT 3 OPERATOR(pg_catalog.+) 4;

在实践中,人们通常依赖于运算符的搜索路径,这样就不必写出如此丑陋的东西。

模式和权限

默认情况下,用户无法访问他们不拥有的架构中的任何对象。若要允许这样做,架构的所有者必须授予对架构的权限。默认情况下,每个人都对架构具有该权限。要允许用户使用架构中的对象,可能需要根据对象的需要授予其他权限 USAGE public。

还可以允许用户在其他人的架构中创建对象。若要允许这样做,需要授予对架构的权限。在从 PostgreSQL 14 或更早版本升级的数据库中,每个人都对架构具有该权限。某些使用模式要求撤消该权限:CREATE public

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

(第一个“public”是架构,第二个“public”是“每个用户”。在第一种意义上,它是一个标识符,在第二种意义上,它是一个关键词,因此大小写不同。

系统目录模式

除了用户创建的架构之外,每个数据库还包含一个架构public,其中包含系统表和所有内置数据类型、函数和运算符。pg_catalog 始终是搜索路径的有效组成部分。如果未在路径中显式命名,则在搜索路径的架构之前会隐式搜索它。这可确保始终可以找到内置名称。但是,如果您希望让用户定义的名称覆盖内置名称,则可以显式放置在搜索路径的末尾。

由于系统表名称以pg_开头,因此最好避免使用此类名称,以确保在将来的某个版本定义了与您的表同名的系统表时不会发生冲突。(使用默认搜索路径时,对表名的非限定引用将解析为系统表。系统表将继续遵循名称以pg_开头的约定,因此只要用户避免使用前缀,它们就不会与非限定的用户表名称冲突。

使用模式

架构可用于以多种方式组织数据。安全架构使用模式可防止不受信任的用户更改其他用户查询的行为。当数据库不使用安全架构使用模式时,希望安全查询该数据库的用户将在每个会话开始时采取保护措施。具体来说,他们将通过设置为空字符串或以其他方式从 中删除非超级用户可写入的模式来开始每个会话。默认配置可以轻松支持几种使用模式:search_path

将普通用户限制为用户专用架构。若要实现此模式,请首先确保没有架构具有公共权限。然后,对于需要创建非临时对象的每个用户,创建与该用户同名的架构,例如CREATE SCHEMA alice AUTHORIZATION alice $user ADMIN OPTION 。(回想一下,默认搜索路径以 开头,解析为用户名。因此,如果每个用户都有单独的架构,则默认情况下他们会访问自己的架构。此模式是一种安全模式使用模式,除非不受信任的用户是数据库所有者或已被授予相关角色,在这种情况下,不存在安全模式使用模式。

在 PostgreSQL 15 及更高版本中,默认配置支持此使用模式。在早期版本中,或者使用从先前版本升级的数据库时,需要从架构中删除公共权限(问题)。然后考虑审核架构中类似对象命名的对象的架构。

 REVOKE CREATE ON SCHEMA public FROM PUBLIC public pg_catalog

通过修改 postgresql.conf 或发出 .然后,授予在公共架构中创建的权限。只有限定的名称才会选择公共架构对象。虽然限定的表引用很好,但对公共架构中的函数的调用将是不安全或不可靠的。如果在公共架构中创建函数或扩展,请改用第一种模式。否则,与第一种模式一样,这是安全的,除非不受信任的用户是数据库所有者或已被授予相关角色。

ALTER ROLE ALL SET search_path = "$user"ADMIN OPTION

保留默认搜索路径,并授予在公共架构中创建的权限。所有用户都隐式访问公共架构。这模拟了架构完全不可用的情况,从而提供了从非架构感知世界的平滑过渡。但是,这从来都不是一个安全的模式。仅当数据库具有单个用户或几个相互信任的用户时,才可接受。在从 PostgreSQL 14 或更早版本升级的数据库中,这是默认设置。

对于任何模式,要安装共享应用程序(每个人都要使用的表、第三方提供的附加函数等),请将它们放入单独的架构中。请记住授予适当的权限以允许其他用户访问它们。然后,用户可以通过使用架构名称限定名称来引用这些附加对象,也可以根据自己的选择将其他架构放入其搜索路径中。

可移植性

在 SQL 标准中,不存在同一架构中的对象由不同用户拥有的概念。此外,某些实现不允许您创建与其所有者名称不同的架构。事实上,模式和用户的概念在仅实现标准中指定的基本模式支持的数据库系统中几乎是等价的。因此,许多用户认为限定名称实际上由 .如果您为每个用户创建每用户架构,这就是 PostgreSQL 的有效行为方式。user_name.table_name

此外,SQL 标准中没有架构的概念。为了最大限度地符合标准,不应使用架构。

当然,某些 SQL 数据库系统可能根本不实现架构,或者通过允许(可能受限的)跨数据库访问来提供命名空间支持。如果您需要使用这些系统,那么完全不使用架构即可实现最大的可移植性。

相关文章:

【PostgreSQL】模式Schema

PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据,该数据库在连接请求中指定。 数据库包含一个或多个命名schema,而这些schema又包含表。schema还包含其他类型…...

JavaScript实现的复杂功能:自动生成带水印的图片

#程序员的崩溃瞬间 在本文中,我们将讨论一个JavaScript实现的复杂功能,该功能可以自动为图片添加水印。这个功能在许多场景中都非常有用,例如,如果你想保护你的图片版权,或者你想在你的网站上显示自定义的水印。 一、…...

图神经网络|8.2 图卷积的计算基本方法

不同于一般的神经网络,网络层数的并不用特别多。 原因是只需要少数次数迭代后(当迭代次数为图上的直径?任意两点最短距离的最大值?),某节点便可获取得到图上所有的节点。 通俗的理解是,在社会中…...

equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 回到…...

六、基于Flask、Flasgger、marshmallow的开发调试

基于Flask、Flasgger、marshmallow的开发调试 问题描述调试方法一调试方法二调试方法三 问题描述 现在有一个传入传出为json格式文件的,Flask-restful开发的程序,需要解决如何调试的问题。 #!/usr/bin/python3 # -*- coding: utf-8 -*- # Project :…...

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …...

现代CPU的多种运行模式

目前的CPU大多是支持X86-64技术的兼容CPU,这包括AMD64以及Intel的IA32E(后被正式命名为EM64T,Extended Memory 64 Technology),因为AMD64先出,而EM64T与AMD64完全兼容,所以也统一称为AMD64技术。…...

Python PDF处理模块pypdf库详解

概要 PDF(Portable Document Format)是一种常见的文档格式,广泛用于存储和共享文本和图像数据。在 Python 中,有许多库可以用于处理 PDF 文件,其中之一就是 PyPDF。PyPDF 是一个功能强大的库,它允许你读取…...

C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

前言 一直以来上位软件比如C等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题,尤其是C上位软件程序员。传统的方法一般有OPC、Socket 等,直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。 Modbus简介 Modbus特点 1 &#…...

PLSQL Developer 15安装和oracle客户端安装

文章目录 前言一、PLSQL Developer1.下载2.安装 二、oracle客户端1.下载2.环境变量 三、使用1. oci2. 连接3. 配置文件 总结 前言 oracle是经常使用的数据库,PLSQL Developer是众多产品中比较不错的一款工具,接下来我们来介绍PLSQL Developer的安装和使…...

【深度deepin】深度安装,jdk,tomcat,Nginx安装

目录 一 深度 1.1 介绍 1.2 与别的操作系统的优点 二 下载镜像文件及VM安装deepin 三 jdk,tomcat,Nginx安装 3.1 JDK安装 3.2 安装tomcat 3.3 安装nginx 一 深度 1.1 介绍 由深度科技社区开发的开源操作系统,基于Linux内核&#xf…...

解决flask启动报错:ImportError: DLL load failed while importing _dukpy: 找不到指定的程序

现象: 原因:dukpy没有win32执行库 解决办法: 到lfd.uci.edu 第三方库下载dukpy的win32 whl文件 注意: 需要跟你python版本和windows平台(32位/64位)对应 https://www.lfd.uci.edu/~gohlke/pythonlibs/#…...

腾讯面试总结

腾讯 一面 mysql索引结构?redis持久化策略?zookeeper节点类型说一下;zookeeper选举机制?zookeeper主节点故障,如何重新选举?syn机制?线程池的核心参数;threadlocal的实现&#xff…...

面向对象进阶(static关键字,继承,方法重写,super,this)

文章目录 面向对象进阶部分学习方法:今日内容教学目标 第一章 复习回顾1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的格式1.4.3 构造方法的应用 1.5 this关键字的作用1.5.1…...

Blazor项目如何调用js文件

以下是来自千问的回答并加以整理:(说一句,文心3.5所给的回答不完善,根本运行不起来,4.0等有钱了试试) 在Blazor项目中引用JavaScript文件(.js)以实现与JavaScript的互操作&#xff…...

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

系列文章目录 前言 一、Windows11 - Ubuntu 双系统安装 硬件信息: 设备名称 DESKTOP-B62D6KE 处理器 13th Gen Intel(R) Core(TM) i5-13500H 2.60 GHz 机带 RAM 40.0 GB (39.8 GB 可用) 设备 ID 7673EF86-8370-41D0-8831-84926668C05A 产品 ID 00331-10000-0000…...

深度学习(学习记录)

题型:填空题判断题30分、简答题20分、计算题20分、综合题(30分) 综合题(解决实际工程问题,不考实验、不考代码、考思想) 一、深度学习绪论(非重点不做考察) 1、传统机器学习&…...

html5实现好看的个人博客模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的文章界面1.4 我的模板界面1.5 文章内容界面 2.结构和源码2.1 目录结构2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/135368653 html5实现好看…...

SpringSecurity深度学习

SpringSecurity简介 spring Security是什么? Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序。它是Spring项目的一部分,旨在为企业级系统提供全面的安全性解决方案。 一个简单的授权和校验…...

odoo17 | 用户界面的基本交互

前言 现在我们已经创建了我们的新模型及其 相应的访问权限,是时候了 与用户界面交互。 在本章结束时,我们将创建几个菜单以访问默认列表 和窗体视图。 数据文件 (XML) Odoo在很大程度上是数据驱动的,因此模块定义的…...

Intel 性能监视器之二

全文来自Intel开发者手册:Intel? 64 and IA-32 Architectures Software Developer’s Manual Volume 3B System Programming Guide.pdf 注意:下文中已经指出手册中的对应页面和章节,请对照手册原文看,任何个人理解错误&#xff…...

Vert.x学习笔记-什么是事件总线

广义事件总线介绍Vert.x的事件总线Vert.x的事件总线的实现方式Vert.x的事件总线通信模式事件总线与消息队列的区别点对点通信模式请求-应答通信模式发布-订阅通信模式 Vert.x的事件总线应用场景Vert.x的事件总线消息Vert.x的事件总线消息示例Vert.x的事件总线的消息类型 拓展 广…...

STM32学习笔记二十二:WS2812制作像素游戏屏-飞行射击游戏(12)总结

至此,飞行射击游戏已经基本实现该有的功能,已经比较接近早期的商业游戏了。 如果采用脚本,可以完成关卡游戏,如果不用,也可以做成无限挑战游戏。 我们汇总一下制作的过程: 1、建模UML 2、主循环处理过程…...

astadmin安装querylist插件Puppeteer

我本来是想在linux服务器上安装,折腾了一天也没安装成功,由于急着用,就先做window10上安装了,以后有时间再研究centos7上安装 一 首先需要安装fastadmin 框架和querylist插件 这个大家可以自行安装,querylist安装地址…...

Python从入门到网络爬虫(MySQL链接)

前言 在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因此在 Python 中如何连接 MySQL 数据库并查询数据成为了一个重要的问题…...

2020年认证杯SPSSPRO杯数学建模A题(第二阶段)听音辨位全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现: 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮,在平地上可以被水平推动或旋转,但不会歪斜),这样的设备称为一个麦克风树。不同的麦…...

深入理解CRON表达式:时间调度的艺术

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...

网络安全—模拟IP代理隐藏身份

文章目录 网络拓扑安装使用代理服务器设置隐藏者设置 使用古老的ccproxy实现代理服务器,仅做实验用途,禁止做违法犯罪的事情,后果自负。 网络拓扑 均使用Windows Server 2003系统 Router 外网IP:使用NAT模式 IP DHCP自动分配或者…...

Resilience4j相关问题及答案(2024)

1、什么是Resilience4j,与Hystrix有何不同? Resilience4j是一个为Java 8和函数式编程设计的故障恢复库,它主要利用了Vavr库中的函数式编程概念。Resilience4j提供了一系列的故障恢复机制,包括断路器(Circuit Breaker&…...

XSKY SDS 产品率先获得 OceanBase V4 新版本认证

近日,北京奥星贝斯科技有限公司(简称:OceanBase)与北京星辰天合科技股份有限公司(简称:XSKY 星辰天合)顺利完成产品兼容性认证。 XSKY 的高性能全闪存储以及混闪存储,与 OceanBase V…...

旅游网站建设公司/广告公司招聘

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_26442553/article/details/79318165 数据仓库:数据仓库全面接收源系统数据&#xff…...

政府网站asp源码/营销咨询公司经营范围

Dubbo协议扩展 dubbo默认的协议是Duubo协议,同时也提供了多种协议的实现,目前实现的扩展有: org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol org.apache.dubbo.rpc.protocol.rmi.R…...

wordpress新奇插件/广州市疫情最新

前段时间有难得的一周左右的时间空闲,在朋友的拉动下玩了开心网,里面有一个小功能很有意思,选择人名的时候,可以根据拼音 或 拼音首字母快速输入,这个功能如果用在我们的应用系统里,对软件的易用性非常有帮…...

网站建设分哪些类别/建站seo是什么

解释器(英语:Interpreter),又译为直译器,是一种电脑程序能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此…...

淘宝装修可以做代码的网站有哪些/建网站模板

1. 哈希 1.1 哈希表 1.1.1 哈希表的定义 哈希表是一种以键-值存储数据的结构,输入待查找的key,即可找到其对应的value。 1.1.2 哈希表实现原理 利用哈希函数将被查找的键转换为数组的索引,来寻找其对应的值。 理想情况下不同的键会被转换…...

重庆建设工程证照查询网站/广州网站设计建设

一、题目[LeetCode-344] 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入:s …...