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

news2024/11/26 22:22:59

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_specification

where role_specification can be:

    user_name
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

URL: https://www.postgresql.org/docs/16/sql-createschema.html

postgres=# 

测试

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 schemas
     Name      |       Owner       
---------------+-------------------
 circle_center | circledba
 circle_oa     | circledba
 circle_shop   | circledba
 public        | 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 TO
 myschema,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.html

ci_database_test02=> 

测试

1.修改架构circle_center 的架构名为circle_blog
ci_database_test02=> alter schema circle_center rename to circle_blog;
ALTER SCHEMA
ci_database_test02=> \dn
         List of schemas
    Name     |       Owner       
-------------+-------------------
 circle_blog | circledba
 circle_oa   | circledba
 circle_shop | circledba
 public      | 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=# \dn
         List of schemas
    Name     |       Owner       
-------------+-------------------
 circle_blog | circledba
 circle_oa   | circledba
 circle_shop | postgres
 public      | 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=# \dn
         List of schemas
    Name     |       Owner       
-------------+-------------------
 circle_blog | circledba
 circle_oa   | circledba
 public      | pg_database_owner
(3 rows)

ci_database_test02=# 

已经成功了

查看Schema列表

命令1

\dn 

测试

ci_database_test02=# \dn
         List of schemas
    Name     |       Owner       
-------------+-------------------
 circle_blog | circledba
 circle_oa   | circledba
 public      | pg_database_owner
(3 rows)

ci_database_test02=# 

命令2

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 = '[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 | public
      13918 | ci_database_test02 | postgres          | information_schema
         11 | ci_database_test02 | postgres          | pg_catalog
         99 | ci_database_test02 | postgres          | pg_toast
      16405 | ci_database_test02 | circledba         | circle_blog
      16404 | ci_database_test02 | circledba         | circle_oa
(6 rows)

ci_database_test02=# 

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

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

相关文章

IDEA2023 + spring cloud 工程热部署设置方法

基于spring cloud 工程进行热部署 &#xff0c;实现每次修改工程源文件&#xff0c;后台自动启动&#xff0c;方便开发测试工作。具体分为5步骤即可&#xff1a; 1、修改工程的pom文件&#xff0c;增加adding devtools 工具包。 <dependency> <groupId>org.s…

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 1 1 5 0 1 3 0 4 8 1 7 5 0 4 8输出样例&#xff1a; 11 30 35 树状数组&#xff1a; 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std;const int N100010; int n,…

【elementui笔记:el-table表格的输入校验】

之前做得比较多的校验是在el-form表单里做的&#xff0c;但有时也遇到&#xff0c;需要在table内输入数据&#xff0c;然后校验输入的数据是否符合要求的情况。因此记录一下。 思路&#xff1a; 1.需要借助el-form的校验&#xff0c;el-table外层嵌套一层el-form&#xff0c;使…

数据分析为何要学统计学(4)——何为置信区间?它有什么作用?

置信区间是统计学中的一个重要工具&#xff0c;是用样本参数()估计出来的总体均值在某置信水平下的范围。通俗一点讲&#xff0c;如果置信度为95%&#xff08;等价于显著水平a0.05&#xff09;&#xff0c;置信区间为[a,b]&#xff0c;这就意味着总体均值落入该区间的概率为95%…

宏基因组学Metagenome-磷循环Pcycle功能基因分析-从分析过程到代码及结果演示-超详细保姆级流程

大背景介绍 生信分析,凡事先看论文,有了论文就有了参考,后续分析就有底了,直接上硬菜开干: PCycDB: a comprehensive and accurate database for fast analysis of phosphorus cycling genes - PubMed 数据库及部分分析代码github库: GitHub - ZengJiaxiong/Phospho…

7.实现任务的rebalance

1.设计 1.1 背景 系统启动后&#xff0c;所有任务都在被执行&#xff0c;如果这时某个节点宕机&#xff0c;那它负责的任务就不能执行了&#xff0c;这对有稳定性要求的任务是不能接受的&#xff0c;所以系统要实现rebalance的功能。 1.2 设计 下面是Job分配与执行的业务点…

深度学习中的潜在空间

1 潜在空间定义 Latent Space 潜在空间&#xff1a;Latent &#xff0c;这个词的语义是“隐藏”的意思。“Latent Space 潜在空间”也可以理解为“隐藏的空间”。Latent Space 这一概念是十分重要的&#xff0c;它在“深度学习”领域中处于核心地位&#xff0c;即它是用来学习…

【每日一题】寻找峰值

文章目录 Tag题目来源解题思路方法一&#xff1a;二分查找 写在最后 Tag 【二分查找】【数组】【2023-12-18】 题目来源 162. 寻找峰值 解题思路 方法一&#xff1a;二分查找 思路 进行二分查找&#xff0c;记当前的二分中点为 mid&#xff1a; 如果 nums[mid] < nums…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

linux驱动的学习 驱动开发初识

1 设备的概念 在学习驱动和其开发之前&#xff0c;首先要知道所谓驱动&#xff0c;其对象就是设备。 1.1 主设备号&次设备号&#xff1a; 在Linux中&#xff0c;各种设备都以文件的形式存在/dev目录下&#xff0c;称为设备文件。最上层的应用程序可以打开&#xff0c;关…

1852_bash中的find应用扩展

Grey 全部学习内容汇总&#xff1a; https://github.com/GreyZhang/toolbox 1852_bash中的find应用扩展 find这个工具我用了好多年了&#xff0c;但是是不是真的会用呢&#xff1f;其实不然&#xff0c;否则也不会出现这种总结式的笔记。其实&#xff0c;注意部分小细节之后…

[AutoSar]基础部分 RTE 介绍

目录 关键词平台说明一、什么是RTE二、RTE的主要功能 关键词 嵌入式、C语言、autosar、EcuM、wakeup、flex 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、什么是RTE RTE&#xff08;Run-Time Environment&…

Docker 的基本概念、优势、及在程序开发中的应用

Docker 是一种容器化平台,它通过使用容器化技术,将应用程序及其依赖性打包到一个独立的、可移植的容器中,从而实现应用程序的快速部署、可靠性和可扩展性。 下面是 Docker 的一些基本概念和优势: 容器:Docker 使用容器化技术,将应用程序及其依赖性打包到一个可移植的容器…

网络基础(十一):VRRP原理与配置

目录 前言&#xff1a; 1、VRRP的基本概述 2、VRRP的基本原理 2.1VRRP的基本结构 2.2设备类型 2.3状态机 2.4VRRP路由器的抢占功能 2.5VRRP路由器的优先级 2.6VRRP工作原理 2.7主备路由器的工作内容 3、VRRP的基本配置 3.1配置主路由器和备用路由器 3.2配置PC1与P…

DOM树和DOM对象与JS关系的深入研究

const和let使用说明 var不好用&#xff0c;我们如果用变量都是用let&#xff0c;如果用常量乃是不变的量&#xff0c;我们用const&#xff0c;见let const知变量是否可变。比如一个常量在整个程序不会变&#xff0c;但是你用let&#xff0c;是可以的。但是let最好与内部变量改…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;…

爬虫练习-获取imooc课程目录

代码&#xff1a; from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目&#xff0c;本来不管作者事儿的&#xff0c;但是后来听到说是室友去网上找人花了80块买了个劣质的&#xff0c;不仅是从CSDN上抄的&#xff0c;而且使用的板子还不符合室友的要求。可叹作者心软啊&#xff0c;顺便给室友做了。 在代码实现部分会给出设…

手机上的python怎么运行,python在手机上怎么运行

大家好&#xff0c;本文将围绕python程序如何在手机端运行展开说明&#xff0c;python程序如何在手机上运行是一个很多人都想弄明白的事情&#xff0c;想搞清楚手机上的python怎么运行需要先了解以下几个事情。 如何用手机编程Python&#xff1f; 1.QPython3&#xff1a;这是一…

高性价比AWS Lambda无服务体验

前言 之前听到一个讲座说到AWS Lambda服务&#xff0c;基于Serverless无服务模型&#xff0c;另外官网还免费提供 100 万个请求 按月&#xff0c;包含在 AWS 免费套餐中是真的很香&#xff0c;对于一些小型的起步的网站或者用户量不大的网站&#xff0c;简直就是免费&#xff…