浅谈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

相关推荐
jiayou6419 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest4 天前
数据库SQL学习
数据库·sql
jnrjian4 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle