【PostgreSQL】从零开始:(十三)PostgreSQL-SQL语句操作架构(模式) Schema

Schema概述

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

用户不一定有权访问集群中的每个数据库。共享角色名称意味着不能在同一集群中的两个数据库中命名不同的角色;但是可以将系统配置为仅允许访问某些数据库。

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

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

  • 允许多个用户使用一个数据库而不会相互干扰。
  • 将数据库对象组织到逻辑组中,使其更易于管理。
  • 第三方应用程序可以放入单独的架构中,以便它们不会与其他对象的名称发生冲突。
    架构类似于操作系统级别的目录,只是架构不能嵌套。

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

schema.table

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

database.schema.table

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

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

CREATE TABLE myschema.mytable (...
);

创建Schema

命令

postgres=# \help create schema
Command:     CREATE SCHEMA
Description: define a new schema
Syntax:
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specificationwhere role_specification can be:user_name| CURRENT_ROLE| CURRENT_USER| SESSION_USERURL: https://www.postgresql.org/docs/16/sql-createschema.htmlpostgres=# 

测试

postgres=# \c ci_database_test02 circledba; #切换到ci_database_test02数据库下 用户名为circledba
Password for user circledba: 
You are now connected to database "ci_database_test02" as user "circledba".
ci_database_test02=> create schema circle_oa; # 创建模式circle_oa
CREATE SCHEMA
ci_database_test02=> create schema circle_center;# 创建模式circle_center
CREATE SCHEMA
ci_database_test02=> create schema circle_shop;# 创建模式circle_shop
CREATE SCHEMA
ci_database_test02=> \dn # 查看模式List of schemasName      |       Owner       
---------------+-------------------circle_center | circledbacircle_oa     | circledbacircle_shop   | circledbapublic        | pg_database_owner
(4 rows)ci_database_test02=> 

再从pgAdmin看看
在这里插入图片描述

其中public是创建数据库时候自带的。

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

CREATE SCHEMA schema_name AUTHORIZATION user_name;

您甚至可以省略架构名称,在这种情况下,架构名称将与用户名相同。

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

公共模式

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

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

查看用户Schema

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

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

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

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

SHOW search_path;

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

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

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

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

设置默认Schema

SET search_path TOmyschema,public;

模式的权限

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

还可以允许用户在其他人的架构中创建对象。若要允许这样做,需要授予对架构的权限。

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

修改模式

命令

ci_database_test02=> \help alter schema
Command:     ALTER SCHEMA
Description: change the definition of a schema
Syntax:
ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
URL: https://www.postgresql.org/docs/16/sql-alterschema.htmlci_database_test02=> 

测试

1.修改架构circle_center 的架构名为circle_blog
ci_database_test02=> alter schema circle_center rename to circle_blog;
ALTER SCHEMA
ci_database_test02=> \dnList of schemasName     |       Owner       
-------------+-------------------circle_blog | circledbacircle_oa   | circledbacircle_shop | circledbapublic      | pg_database_owner
(4 rows)ci_database_test02=> 
2.修改架构circle_shop 的用户属主为postgres
ci_database_test02=> alter schema circle_shop owner to postgres;
ERROR:  must be able to SET ROLE "postgres" # 提示我们没有postgres权限,不让我们修改,circledba只是个普通用户
ci_database_test02=> \c - postgres #切换到数据库管理员postgres
Password for user postgres: 
You are now connected to database "ci_database_test02" as user "postgres".
ci_database_test02=# alter schema circle_shop owner to postgres; #再次修改
ALTER SCHEMA
ci_database_test02=# \dnList of schemasName     |       Owner       
-------------+-------------------circle_blog | circledbacircle_oa   | circledbacircle_shop | postgrespublic      | pg_database_owner
(4 rows)ci_database_test02=# 

看到circle_shop 的属主已经变为了postgres

删除Schema

命令

ci_database_test02=# \help drop schema;
Command:     DROP SCHEMA
Description: remove a schema
Syntax:
DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]URL: https://www.postgresql.org/docs/16/sql-dropschema.html
ci_database_test02=# 

测试

删除名为cricle_shop的Schema

ci_database_test02=# drop schema circle_shop;
DROP SCHEMA
ci_database_test02=# \dnList of schemasName     |       Owner       
-------------+-------------------circle_blog | circledbacircle_oa   | circledbapublic      | pg_database_owner
(3 rows)ci_database_test02=# 

已经成功了

查看Schema列表

命令1

\dn 

测试

ci_database_test02=# \dnList of schemasName     |       Owner       
-------------+-------------------circle_blog | circledbacircle_oa   | circledbapublic      | pg_database_owner
(3 rows)ci_database_test02=# 

命令2

SELECTpn.oid AS schema_oid,iss.CATALOG_NAME,iss.schema_owner,iss.SCHEMA_NAME 
FROMinformation_schema.schemata issINNER JOIN pg_namespace pn ON pn.nspname = iss.SCHEMA_NAME
WHERE iss.catalog_name = '[dbname]';

测试

ci_database_test02=# SELECT                                                                                                                                                                                                                   pn.oid AS schema_oid,                                                                                                                                                                                                                         iss.CATALOG_NAME,                                                                                                                                                                                                                             iss.schema_owner,                                                                                                                                                                                                                             iss.SCHEMA_NAME                                                                                                                                                                                                                               FROM                                                                                                                                                                                                                                          information_schema.schemata iss                                                                                                                                                                                                               INNER JOIN pg_namespace pn ON pn.nspname = iss.SCHEMA_NAME                                                                                                                                                                                    WHERE iss.catalog_name = 'ci_database_test02';schema_oid |    catalog_name    |   schema_owner    |    schema_name     
------------+--------------------+-------------------+--------------------2200 | ci_database_test02 | pg_database_owner | public13918 | ci_database_test02 | postgres          | information_schema11 | ci_database_test02 | postgres          | pg_catalog99 | ci_database_test02 | postgres          | pg_toast16405 | ci_database_test02 | circledba         | circle_blog16404 | ci_database_test02 | circledba         | circle_oa
(6 rows)ci_database_test02=# 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl kafka的简单应用

安装并配置单机版kafka所需环境 wsl2 环境可用性较高,如下介绍在该环境中安装单机版本kafka的详细过程。 启动命令行工具启动wsl:wsl --user root --cd ~,(以root用户启动,进入wsl后当前路径为~“用户主目录”&#…

【数据结构】复习题(一)

一、选择题 1.组成数据的基本单位是()。 A. 数据项 B.数据类型 C.数据元素 D.数据变量 2.设数据结构A{D,R},其中D&#xff5b;1,2,3,4},R{r},r{<1,2>,<2,3>,< 3,4>,<4,1>}&#xff0c;则数据结构A是()。 A.线性结构 B.树型结构 C.图型结构 D.集合 3.…

分布式定时任务系列7:XXL-job源码分之任务触发

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

【Linux】模拟实现shell命令行解释器

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 主要思路2. 流程图3. 实现过程3.1 初步实现3.2 当前路径3.3 内建命令/外部命令3.4…

Harmony4.0鸿蒙应用开发初识+实践小案例

Harmony4.0鸿蒙应用开发初识实践小案例 一、华为的“18N”产品战略 在华为HarmonyOS及全场景新品发布会上&#xff0c;华为介绍了华为“18N”三圈层全场景智慧生态解决方案&#xff0c;从而打造面向未来的全新生态&#xff0c;其中&#xff0c;1指的是手机&#xff0c;8指的是…

neuq-acm预备队训练week 9 P1330 封锁阳光大学

题目描述 曹是一只爱刷街的老曹&#xff0c;暑假期间&#xff0c;他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹&#xff0c;感到不爽。河蟹决定封锁阳光大学&#xff0c;不让曹刷街。 阳光大学的校园是一张由 n 个点构成的无向图&#xff0c;n 个点之间由 m 条道…

小程序开发使用vant库

初始化项目步骤就不做阐述。 第一步&#xff1a;安装依赖 vant/weapp npm下载命令&#xff1a;npm i vant/weapp -S --production npm下载命令&#xff1a;yarn add vant/weapp -S --production 第二步 &#xff1a;修改配置 1、找到miniprogram文件下的app.json 将 app.j…

玩转Docker(五):网络

文章目录 〇、关于linux系统网络一、none网络二、host网络三、bridge网络四、user-defined网络 Docker安装时会自动在host上创建三个网络&#xff0c;我们可用docker network ls命令查看&#xff1a; docker network ls那么这几种网络分别有什么含义呢&#xff1f;在回答这个问…

机器视觉技术与应用实战(Chapter Two-03)

2.5 图像滤波和增强 滤波的作用是&#xff1a;图像中包含需要的信息&#xff0c;也包含我们不感兴趣或需要屏蔽的干扰&#xff0c;去掉这些干扰需要使用滤波。 增强的作用是&#xff1a;通过突出或者抑制图像中某些细节&#xff0c;减少图像的噪声&#xff0c;增强图像的视觉效…

Jenkins----基于 CentOS 或 Docker 安装部署Jenkins并完成基础配置

查看原文 文章目录 基于 CentOS7 系统部署 Jenkins 环境基于 Docker 安装部署 Jenkins环境配置 Jenkins 中文模式配置用户名密码形式的 Jenkins 凭据配置 ssh 私钥形式的 Jenkins 凭据配置 Jenkins 执行任务的节点 基于 CentOS7 系统部署 Jenkins 环境 &#xff08;1&#xff…

使用Nginx实现负载均衡的实践指南

目录 前言1 负载均衡简介2 需要实现的效果3 准备2个tomcat服务器4 配置Nginx实现负载均衡5 Nginx的服务器策略5.1 轮询&#xff08;默认&#xff09;5.2 权重&#xff08;weight&#xff09;5.3 IP哈希&#xff08;ip_hash&#xff09;5.4 响应时间公平分配&#xff08;fair&am…

C# DotNetCore AOP简单实现

背景 实际开发中业务和日志尽量不要相互干扰嵌套&#xff0c;否则很难维护和调试。 示例 using System.Reflection;namespace CSharpLearn {internal class Program{static void Main(){int age 25;string name "bingling";Person person new(age, name);Conso…

Day63力扣打卡

打卡记录 寻找最近的回文数&#xff08;模拟&#xff09; 链接 class Solution:def nearestPalindromic(self, n: str) -> str:m len(n)candidates [10 ** (m - 1) - 1, 10 ** m 1]selfPrefix int(n[:(m 1) // 2])for x in range(selfPrefix - 1, selfPrefix 2):y …

[强网杯 2019]Upload

[强网杯 2019]Upload 开放注册直接注册一个账号然后登录进去 先对页面进行简单文件上传测试发现都不存在漏洞对网站进行目录扫描 发现www.tar.gz 打开发现是tp5框架发现源码 这里如果前面信息收集的完整会发现存在反序列化 对注册&#xff0c;登录&#xff0c;上传文件页面分…

STM32F103RCT6开发板M3单片机教程06--定时器中断

前言 除非特别说明&#xff0c;本章节描述的模块应用于整个STM32F103xx微控制器系列&#xff0c;因为我们使用是STM32F103RCT6开发板是mini最小系统板。本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; STM32F10X定时器(Timer)基础 首先了解一下是STM32F10X…

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测 目录 时序预测 | Python实现GRU-XGBoost组合模型电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前…

Linux:超级管理员(root用户)创建用户、用户组

root用户&#xff1a; 拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。 演示&#xff1a; 1、使用普通用户在根目录下创建文件夹&#xff08;失败&#xff09; 2、切换到root用户后&#xff0c;继续尝试&#xff08;成功&#xff09; 3、普通用户的权限&#…

TCP/IP详解——DNS 流量分析

文章目录 1. DNS 流量分析1.1 DNS 基本概念1.2 DNS 系统特性1.3 DNS 效率问题1.4 域名的组成1.5 域名解析系统1.5.1 域名解析过程 1.6 DNS 记录种类1.7 DNS 的报文格式1.7.1 DNS 报文中的基础结构部分1.7.2 DNS 查询报文中的问题部分1.7.3 DNS 响应报文中的资源记录部分1.7.4 示…

【开源项目】WPF 扩展 -- 多画面视频渲染组件

目录 1、项目介绍 2、组件集成 2.1 下载地址 2.2 添加依赖 3、使用示例 3.1 启动动画 3.2 视频渲染 3.3 效果展示 4、项目地址 1、项目介绍 Com.Gitusme.Net.Extensiones.Wpf 是一款 Wpf 扩展组件。基于.Net Core 3.1 开发&#xff0c;当前是第一个发布版本 1.0.0&am…

Java架构师系统架构内部维度分析

目录 1 导语2.1 安全性维度概述2.2 流程安全性2.3 架构安全性2.4 安全维度总结3 伸缩性维度概述和场景思路3.1 无状态应用弹性伸缩3.2 阿里云Knative弹性伸缩3.3 有状态应用弹性伸缩3.4 伸缩性维度总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语