浅谈PostgreSQL 模式(SCHEMA)

一、概念介绍

PostgreSQL的 模式 (SCHEMA) 是一个非常重要且强大的概念,它本质上是数据库内部的命名空间目录,用于组织和管理数据库对象(如表、视图、函数、索引等)。

PostgreSQL 的模式是一个强大的逻辑隔离和组织工具。它超越了简单的"数据库用户"概念,提供了更精细的命名空间管理。正确使用模式可以让你的数据库结构更清晰、更安全、更易于维护,也是实现中型多租户应用的理想选择。

默认模式: 每个数据库创建时都会自动生成一个名为 public 的模式。如果未指定模式,对象默认创建在此处。

相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。

使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 将数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

二、创建模式

2.1语法

我们可以使用 CREATE SCHEMA语句来创建模式,语法格式如下:

sql 复制代码
CREATE SCHEMA myschema (
...
);

上述语句将创建一个名为 myschema 的模式。

模式通常用于组织和隔离数据库对象,防止对象名称冲突。

创建表(Table)使用 CREATE TABLE 语句:

sql 复制代码
CREATE TABLE myschema.mytable (
    column1 datatype1,
    column2 datatype2,
    ...
);

上述语句将在 myschema 模式下创建一个名为 mytable 的表,并定义了一系列的列及其数据类型。

请注意,上述的 datatype1, datatype2 等应该被替换为实际的数据类型,例如 integer, varchar(255), 等等。

2.2使用 psql 命令行工具

sql 复制代码
-- 连接到数据库
psql -U username -d database_name

-- 创建 schema
CREATE SCHEMA schema_name;

-- 创建 schema 并指定所有者
CREATE SCHEMA schema_name AUTHORIZATION owner_name;

-- 如果不存在则创建
CREATE SCHEMA IF NOT EXISTS schema_name;

2.3使用 pgAdmin 图形界面

sql 复制代码
连接到数据库

右键点击 "Schemas" → "Create" → "Schema"

填写 schema 名称和所有者

点击 "Save"

2.4创建带有权限控制的 schema

sql 复制代码
-- 创建 schema
CREATE SCHEMA myschema;

-- 授权给用户
GRANT USAGE ON SCHEMA myschema TO username;

-- 授予所有权限
GRANT ALL ON SCHEMA myschema TO username;

-- 允许用户在该 schema 中创建对象
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema 
GRANT ALL ON TABLES TO username;

三、删除模式

删除一个为空的模式(其中的所有对象已经被删除):

sql 复制代码
DROP SCHEMA myschema;

删除一个模式以及其中包含的所有对象:

sql 复制代码
DROP SCHEMA myschema CASCADE;

四、修改模式

sql 复制代码
-- 修改 schema 名称
ALTER SCHEMA old_name RENAME TO new_name;

-- 修改 schema 所有者
ALTER SCHEMA schema_name OWNER TO new_owner;

五、查询模式

sql 复制代码
-- 查看所有 schema
\dn

-- 查看 schema 详细信息
\dn+

五、注意事项

  • PostgreSQL 默认有一个 public schema
  • 每个数据库可以有多个 schema
  • 不同 schema 中的对象名可以相同
  • 使用 search_path 来控制对象查找顺序
  • 生产环境中建议为不同应用或模块使用不同的 schema 进行隔离

参考文件:https://www.runoob.com/postgresql/postgresql-schema.html

相关推荐
科技小花4 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56615 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717216 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi7 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai7 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw07 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209258 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
ACP广源盛139246256738 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑