📅  最后修改于: 2020-11-30 07:49:29             🧑  作者: Mango
在本节中,我们将学习PostgreSQL架构,公共架构,PostgreSQL如何使用架构搜索路径来解析Schema中的对象,PostgreSQL架构和特权,以及使用PostgreSQL Schema的优点。
每个数据库都以一个模式开头,并且应该是公共模式。模式是表的命名集合。
Schema是一个命名空间,提供了一些对象,例如
注意:PostgreSQL模式是保存命名对象的名称空间。
在PostgreSQL模式中,我们可以使用以下语句将模式名称作为前缀来固定名称,以访问模式的对象:
schema_name.object_name
否则,我们可以设置一个包含模式的搜索路径,我们也可以覆盖在今后的模式搜索路径。
一个数据库可以具有一个或多个模式,而每个模式仅存在于一个数据库中,并且两个模式可以包含不同的对象,它们共享相似的名称。
例如
假设我们有包含员工表的Company模式,而公共模式也有Employee表。当我们引用Employee表时,它应如下所示:
public.comany
Or
Employee.company
在PostgreSQL中,出于以下主要原因使用模式:
因此,出于创建目的,我们可以在模式高级管理中将应用程序数据分开。并且出于最终用户的目的,我们可以通过互相帮助使用户保持在不同的架构中。
在PostgreSQL教程的较早主题中,我们创建表时未描述任何模式名称。这些表和其他对象默认情况下会自动放入公共模式。
PostgreSQL为每个新数据库生成一个称为public的模式。因此,以下命令是并行的:
CREATE TABLE table_name;
And
CREATE TABLE public.table_name;
例如
要访问Employee表,我们使用company.Employee 。
注意:
SELECT current_schema();
输出量
执行完以上命令后,我们将得到以下输出:
注意:PostgreSQL对我们在数据库中创建的每个新对象都使用public。
我们可以使用下面的SHOW语句查看当前的搜索路径。
SHOW search_path;
输出量
执行完以上命令后,我们将得到以下输出:
在上面的输出中:
要创建一个新的模式,我们可以使用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模式的新模式Company和Employee表:
为了访问Company模式中的Employee表,我们可以使用以下命令之一:
SELECT * FROM Employee;
Or
SELECT * FROM Company.Employee;
公共模式是搜索路径中的第二个组件。因此,要访问公共架构中的Employee表,我们应该在下面指定表名:
SELECT * FROM public.Employee;
一旦执行了以上所有语句,我们将获得以下输出。
运行第一个命令后,我们将获得以下输出:
执行第二条命令后,我们将获得以下输出:
一旦执行了最后一条命令,我们将获得以下输出:
执行完所有三个命令后,我们将获得相同的输出,这就是为什么我们可以使用上述任何查询来访问Company模式中的employee表的原因。
注意:我们也可以删除公共模式,因为它不是唯一的模式。
用户只能具有访问他们创建的架构中的对象的特权,这意味着用户不能使用他们未创建的架构中的任何其他对象。
因此,我们必须为用户授予使用权限,以便获得他们未创建的架构中对象的所有访问权限。
以下命令用于获取架构上用户的使用权限:
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模式的一些普遍优势如下: