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

相关推荐
等....11 分钟前
Redis使用
数据库·redis·mybatis
betazhou12 分钟前
记一次Oracle REDO在线日志损坏故障修复
数据库·oracle·redo·ora-00600
一只小bit13 分钟前
Redis 初步入门教程:简单介绍和安装配置
数据库·redis·缓存
ChatInfo24 分钟前
Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模
数据库·人工智能·mysql
SPC的存折1 小时前
6、MySQL设置TLS加密访问
linux·运维·服务器·数据库·mysql
老苏畅谈运维1 小时前
DBA分析 ORA 报错的利器,errorstack让 Oracle 错误现原形
数据库·oracle·dba
紫青宝剑1 小时前
向量数据库 Milvus
数据库·milvus
雪碧聊技术1 小时前
数据库系统基础知识
数据库
Elastic 中国社区官方博客1 小时前
如何使用 LogsDB 降低 Elasticsearch 日志存储成本
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·可用性测试
Dreamboat-L1 小时前
HBase远程访问配置(详细教程)
大数据·数据库·hbase