玩转PostgreSQL(二):如何使用模式搜索路径
总结:在本文中您将学习PostgreSQL模式以及如何使用模式搜索路径并解析模式中的对象。
?什么是 PostgreSQL Schema
在 PostgreSQL 中,schema 是一个命名空间,其中包含称为数据库的对象,例如表、视图、索引、数据类型、函数、存储过程和标识符。
要访问模式中的对象,我们必须使用以下语法限定对象:
schema_name.object_name
一个数据库可以包含一个或多个模式,并且每个模式仅属于一个数据库。两个模式可以具有共享相同名称的不同对象。
例如,您可能有 测试
架构、用户
表、
SELECT * FROM test.user;
❿还有 ❿公共用户
表。当引用 user
表时,您必须按如下方式对其进行限定:
public.user
还是
test.user
?为什么需要使用方案
?为什么需要使用模式:
- 模式允许我们将数据库对象(例如表)转换为逻辑组,以使其更易于管理。
- 架构允许多个用户使用数据库而不会互相干扰。
?public
schema
对于每个新数据库,PostgreSQL 都会自动创建一个名为 和 实际上指的是没有模式名称的表,例如作为 如果仅通过名称引用表,PostgreSQL 将使用 搜索路径 ,它是 模式❀的列表。 PostgreSQL 将访问模式搜索路径中的第一个匹配表。如果不匹配,即使该名称存在于数据库的另一个架构中,也会返回错误。 搜索路径中的第一个模式称为当前模式。请注意如果我们创建一个新对象而没有显式指定模式名称,PostgreSQL 也将使用新对象的当前模式。函数 输出 因此,对于我们创建的每个新对象,PostgreSQL 使用 要创建新方案,请使用 要向搜索路径添加新方案,请使用以下命令: ❀Name Or 如果您使用模式,则必须明确引用 用户只能访问他们拥有的架构中的对象。这意味着他们无法接收模式中不属于他们的对象。 要允许用户访问他们不拥有的模式中的对象,我们必须 要允许用户在他们没有的模式中创建对象,我们必须授予他们 ?请注意在 在此之前,我们了解了 PostgreSQL 架构以及 PostgreSQL 如何使用搜索路径来解析对象名称。 ? 注意:这里我们将学习如何使用PostgreSQL 在以下语法中: ? 注意:要执行 我们还可以为用户创建架构: 在本例中, 的架构已创建,并且还允许我们创建对象语句和视图的表,如下所示: ? 注意:请注意,每个子命令不以分号 (;) 结尾。 让我们举一些例子来理解 以下语句使用 以下示例使用 ? 注意:在上面的文章中,我们学习了如何使用 PostgreSQL ? 注意: 请请注意,要执行此语句,我们必须是架构的所有者并拥有数据库权限 除了重命名 schema 之外, ? 注意 : 让我们给出一些使用 请请注意,以下部分中的示例基于我们所做的 此示例使用 类似地重命名以下示例 或下面使用 的示例更改架构 以下是查询用户创建的架构的语句: 从输出中可以清楚地看出 同样,此语句将测试的所有者更改为 ?在上面的文章中,我们学习了如何使用 PostgreSQL 以下是 ?解释: 要执行 PostgreSQL 允许您在一个 本示例使用 选择要删除的列表右键选择不刷新菜单。 : 以下示例使用 此语句删除 以下是控制台输出: 因此,如果模式不为空,并且我们想要模式及其对象删除,我们必须使用 ( 同样,我们可以使用以下语句从 作者:只是看着你public❿❿ 的 schema。无论我们创建的对象是否指定了模式名称,PostgreSQL 都会将其放置在
public
模式中。因此,以下陈述是否等效:CREATE TABLE table_name(
...
);
CREATE TABLE public.table_name(
...
);
?模式搜索路径
test.user
表。 current_schema()
返回当前模式: SELECT current_schema();
current_schema
----------------
public
(1 row)
public 修饰符。 A " $user"
指定 PostgreSQL 用于搜索与当前用户同名的对象的第一个方案。例如,如果我们使用 postgres
用户登录并访问 user
表。 PostgreSQL 在 postgres
架构中搜索 user
表。如果未找到此类对象,请继续在 public
架构中搜索 user
表。 public
模式。 CREATE SCHEMA
说明: CREATE SCHEMA test;
user
没有要指定模式名称,PostgreSQL 将其放在 user
表中 ♓❓❓Test❿❿ Test
模式访问 user对于 表,我们可以使用以下之一语句使用:
SELECT * FROM user;
SELECT * FROM test.user;
public
schema 是搜索路径中的第二个元素,因此要访问 public schema 中的 er❿er❿ 表,我们的表名必须限定如下: SELECT * FROM public.staff;
public
,那么您可以删除它吗? PostgreSQL 架构和权限
USAGE
授予模式权限 GRANT USAGE ON SCHEMA schema_name
TO role_name;
CREATE
架构权限:GRANT CREATE ON SCHEMA schema_name
TO user_name;
public
模式中,每个用户都有 CREATE
和 USAGE。
? PostgreSQL 模式操作
CREATE SCHEMA
声明。 ALTER SCHEMA
语句。 DELETE SCHEMA
语句。 ?PostgreSQL
SCHEMA CREATE
语句概述CREATE SCHEMA
语句在数据库中使用创建一个新的schema。 CREATE SCHEMA
语句允许我们在当前数据库中创建一个新模式。 CREATE SCHEMA
语句: CREATE SCHEMA [IF NOT EXISTS] schema_name;
CREATE♿♿♿♿♿♿♿♿ 之后指定架构。模式名称在当前数据库中必须是唯一的。
IF NOT EXIST
仅在新架构不存在时有条件地创建新架构。尝试在不使用 IF NOT EXISTS
语句的情况下创建已存在的新架构将导致错误。 CREATE SCHEMA
语句,我们必须在当前数据库中有♓CREATE❝。CREATE SCHEMA [IF NOT EXISTS]
AUTHORIZATION username;
用户名
CREATE SCHEMA schema_name
CREATE TABLE table_name1 (...)
CREATE TABLE table_name2 (...)
CREATE VIEW view_name1
SELECT select_list FROM table_name1;
?PostgreSQL
CREATE SCHEMA
示例 ♿♿♿♿♿♿♿。
和 ?1) 使用
CREATE SCHEMA
创建新的 SCHEMA 示例 CREATE♿ 名称
示例of 语句删除空模式 CREATE d
。 测试
The以下语句返回当前数据库中的所有架构: SELECT *
FROM pg_catalog.pg_namespace
ORDER BY nspname;)
?2) 使用
CREATE SCHEMA♿ 为用户 gg- ?3) 使用
CREATE SCHEMA SCHEMA 创建架构及其对象的示例
CREATE SCHEMA♓♓♓❿❿名称 ssm
。它还创建一个名为 spring
的表和一个名为 spring_boot
CREATE SCHEMA ssm
CREATE TABLE spring(
id SERIAL NOT NULL,
version DATE NOT NULL
)
CREATE VIEW spring_boot AS
SELECT ID, version
FROM spring
WHERE version <= 2.2.0;
CREATE SCHEMA
语句在数据库中创建新架构。 ?PostgreSQL
ALTER SCHEMA
语句概述 ALTER SCHEMA
语句允许我们更改模式的定义。例如,我们可以将模式重命名为:ALTER SCHEMA schema_name
RENAME TO new_name;
OLD SCHEMA
关键字后指定旧 schema_name。RENAME
关键字后指定新的 new_name。 CREATE
。 ALTER SCHEMA
还允许我们将 schema 的所有者更改为新的所有者,如以下语句所示:ALTER SCHEMA schema_name
OWNER TO { new_owner | CURRENT_USER | SESSION_USER};
ALTER SCHEMA
指定要更改所有者的模式的名称。 所有者
输入新所有者。 ? PostgreSQL
ALTER SCHEMA
语句示例 ALTER SCHEMA
的示例。 CREATE SCHEMA
。 ?1) 使用
OLD SCHEMA
重命名架构的示例 ♓AlTER SCHEMAOLD SCHEMA dd
pp 的架构 的声明schema:
将模式 dd 的所有者更改为 postgres 的语句; ALTER SCHEMA dd
RENAME TO pp;
Tester
schema:ALTER SCHEMA tests
RENAME TO test;
?2) 使用
ALTER SCHEMA tests
RENAME TO test;
?2) 使用 ❿AL 语句更改架构所有者
ALTER SCHEMA dd
OWNER TO postgres;
SELECT *
FROM
pg_catalog.pg_namespace
WHERE
nspacl is NULL AND
nspname NOT LIKE 'pg_%'
ORDER BY
nspname;
dd
架构现在由 ID 为 10 的所有者拥有,该所有者s postgres
:ALTER SCHEMA test
OWNER TO postgres;
Change Mode
语句来重命名 schema 或将 schema 的所有者更改为新 schema。 ?PostgreSQL
DROP SCHEMA
语句概述 DROP SCHEMA
删除数据库中的每个对象。DROP SCHEMA
语法:DROP SCHEMA [IF EXISTS] schema_name
[ CASCADE | RESTRICT ];
DROP SCHEMA
在关键字之后,指定要从 schema_name 中删除的架构。CASCADE
(级联)删除架构及其所有对象,从而删除依赖于这些对象的所有对象。如果您只想删除空架构,可以使用选项RESTRICT
。默认情况下,DROP SCHEME
使用选项 RESTRICT
。 DROP SCHEMA
语句,我们必须是要删除的架构的所有者或超级用户。DROP SCHEMA
语句中删除多个架构: DROP SCHEMA [IF EXISTS] schema_name1 [,schema_name2,...]
[CASCADE | RESTRICT];
?PostgreSQL OP❿ SCHEMAOP❿ 示例
?1) 使用 删除架构
DROP SCHEMA
语句删除 gg: DROP SCHEMA IF EXISTS gg;
DROP SCHEMA IF EXISTS gg;
DROP SCHEMA IF EXISTS gg;
DROP SCHEMA IF EXISTS gg;
?2) 使用
DROP SCHEMA
删除多个模式。示例 DROP SCHEMA
删除多个架构。 ggtest
使用单个语句:DROP SCHEMA IF EXISTS gg, test;
?3) 使用
Test
使用单个语句:DROP SCHEMA IF EXISTS gg, test;
?3)使用
测试♿非空模式示例
ssm
模式:DROP SCHEMA ssm;
ERROR: cannot drop schema scm because other objects depend on it
DETAIL: table scm.deliveries depends on schema scm
view scm.delivery_due_list depends on schema scm
HINT: Use DROP ... CASCADE to drop the dependent objects too.
SQL state: 2BP01
CASCADE
):DROP SCHEMA scm CASCADE;
pp 中删除模式及其对象:在本文中,我们学习了如何删除使用 PostgreSQL 'DROP SCHEMA' 语句删除数据库中的一个或多个模式。
来源:稀土掘金
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。