📜  PostgreSQL模式

📅  最后修改于: 2020-11-30 07:49:29             🧑  作者: Mango

PostgreSQL模式

在本节中,我们将学习PostgreSQL架构,公共架构,PostgreSQL如何使用架构搜索路径来解析Schema中的对象,PostgreSQL架构和特权,以及使用PostgreSQL Schema的优点

PostgreSQL模式介绍

每个数据库都以一个模式开头,并且应该是公共模式。模式是表的命名集合。

Schema是一个命名空间,提供了一些对象,例如

  • 观看次数
  • 指标
  • 顺序
  • 资料类型
  • 经营者
  • 职能
  • 桌子
  • 其他关系。


注意:PostgreSQL模式是保存命名对象的名称空间。

PostgreSQL模式中,我们可以使用以下语句将模式名称作为前缀来固定名称,以访问模式的对象:

schema_name.object_name

否则,我们可以设置一个包含模式的搜索路径,我们也可以覆盖在今后的模式搜索路径。

一个数据库可以具有一个或多个模式,而每个模式仅存在于一个数据库中,并且两个模式可以包含不同的对象,它们共享相似的名称。

例如

假设我们有包含员工表的Company模式,而公共模式也有Employee表。当我们引用Employee表时,它应如下所示:

public.comany
Or
Employee.company

为什么我们需要在PostgreSQL中使用模式?

PostgreSQL中,出于以下主要原因使用模式:

  • 最终用户只能使用那些允许将测试表和逻辑与生产表分离的架构。
  • 在模式中,我们可以有效地获取数据,并可以应用于以下一些活动:
    • 我们可以快速恢复存在于不同模式中的数据。因此,可以分别返回和备份面向应用程序的架构,以进行恢复和时间旅行。
    • 当应用程序数据处于模式中时,我们可以管理应用程序更改。因此,该应用程序的新版本可以在新架构中的表结构上工作,包括对架构名称的简单修改。
    • 我们可以轻松地备份单独模式中存在的数据。因此,不稳定数据可以具有来自非易失性数据的多个备份计划。

因此,出于创建目的,我们可以在模式高级管理中将应用程序数据分开。并且出于最终用户的目的,我们可以通过互相帮助使用户保持在不同的架构中。

公共模式

在PostgreSQL教程的较早主题中,我们创建表时未描述任何模式名称。这些表和其他对象默认情况下会自动放入公共模式。

PostgreSQL为每个新数据库生成一个称为public的模式。因此,以下命令是并行的:

CREATE TABLE table_name;
And
CREATE TABLE public.table_name;

PostgreSQL模式搜索路径

  • 在PostgreSQL中,如果仅通过表名选择表,则可以在模式搜索路径的帮助下搜索表。
  • PostgreSQL将为模式搜索路径中的初始等效表提供特权。如果没有匹配项,它将抛出一个错误,或者甚至该名称出现在数据库的替代模式中。
  • 在PostgreSQL中,当前模式在搜索路径中称为主要模式。
  • 我们经常可以在模式搜索路径中引用没有模式名称的表。

例如

要访问Employee表,我们使用company.Employee

注意:

  • 如果我们在不描述模式名称的情况下创建新对象,则PostgreSQL还将对新对象使用当前模式。
  • current_schema()方法用于返回当前架构。
SELECT current_schema();

输出量

执行完以上命令后,我们将得到以下输出:


注意:PostgreSQL对我们在数据库中创建的每个新对象都使用public。

我们可以使用下面的SHOW语句查看当前的搜索路径。

SHOW search_path;

输出量

执行完以上命令后,我们将得到以下输出:

在上面的输出中:

  • “ $ user”定义了PostgreSQL用于查找名称与当前用户名称相似的对象的第一个模式。例如,如果我们使用Postgres用户登录并拥有Employee表的特权。在Postgres模式中,PostgreSQL将搜索Employee表。如果找不到类似的对象,它将继续在公共模式中搜索对象。
  • 正如我们之前所了解的,第二个组件是指定公共模式。

要创建一个新的模式,我们可以使用CREATE SCHEMA命令

CREATE SCHEMA Company;

输出量

为了将新的架构添加到搜索路径,我们可以使用以下语句:

SET search_path TO Company, public;

输出量

如果我们在不描述模式名称的情况下创建了一个新的表Employee ,那么PostgreSQL将把这个Employee表放入Company模式:

CREATE TABLE Employee(
Emp_id SERIAL PRIMARY KEY,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
Age integer NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
address CHARACTER(50), 
salary REAL
);

输出量

下面的屏幕快照显示了属于Company模式的新模式CompanyEmployee表:

为了访问Company模式中的Employee表,我们可以使用以下命令之一:

SELECT * FROM Employee;
Or 
SELECT * FROM Company.Employee;

公共模式是搜索路径中的第二个组件。因此,要访问公共架构中的Employee表,我们应该在下面指定表名:

SELECT * FROM public.Employee;

一旦执行了以上所有语句,我们将获得以下输出。

运行第一个命令后,我们将获得以下输出:

执行第二条命令后,我们将获得以下输出:

一旦执行了最后一条命令,我们将获得以下输出:

执行完所有三个命令后,我们将获得相同的输出,这就是为什么我们可以使用上述任何查询来访问Company模式中的employee表的原因

注意:我们也可以删除公共模式,因为它不是唯一的模式。

PostgreSQL模式和特权

用户只能具有访问他们创建的架构中的对象的特权,这意味着用户不能使用他们未创建的架构中的任何其他对象。

因此,我们必须为用户授予使用权限,以便获得他们未创建的架构中对象的所有访问权限。

以下命令用于获取架构上用户的使用权限:

GRANT USAGE ON SCHEMA schema_name TO user_name;

为了允许用户在他们未创建的架构中创建对象,我们必须授予他们CREATE特权

以下命令用于授予模式的创建特权:

GRANT CREATE ON SCHEMA schema_name TO user_name;

注意:默认情况下,每个用户在公共架构上都具有USAGE和CREATE特权。

如果我们不想在以下命令的帮助下访问该特权,则可以撤消该特权。

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

在这里,第一个公共指的是架构,第二个公共指的是每个用户

PostgreSQL模式动作

  • 我们可以使用CREATE SCHEMA命令来创建新的模式。
  • 我们可以使用DROP SCHEMA命令删除模式。
  • 我们可以使用ALTER SCHEMA命令重命名模式或修改所有者。

使用PostgreSQL模式的好处

该模式使我们可以简化许多用户使用一个数据库而彼此之间不涉及的情况。 PostgreSQL模式的一些普遍优势如下:

  • 在PostgreSQL架构中,关键优势在于,如果数据库属于不同的架构,则它可以具有相同的表名。
  • 架构可以将数据库对象分类为逻辑组,以使其更具可控性。
  • 该架构允许用户使用一个数据库来替代多个数据库。
  • 为了避免与其他对象的名称冲突,我们可以将第三方架构放入不同的架构中。
  • 名称相似的对象只要放在不同的架构中就不会冲突。