别再忽视!PostgreSQL Public 模式的风险以及安全迁移
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
问题起因前几天有群友在群里面咨询
另外一位群友说到
PG中默认的public模式带来的问题
public 模式默认对所有数据库用户都开放访问权限。换句话说,所有连接到数据库的用户默认都可以访问 public 模式中的对象(除非你手动修改权限)。
public 模式是所有用户和所有扩展默认使用的模式,容易发生命名冲突。
使用 public 模式进行业务操作会使数据库的架构设计显得杂乱无章,随着时间推移,尤其是在大型项目或多个项目共享数据库时,public模式中的对象数量会急剧增加
许多 PostgreSQL 扩展默认使用 public 模式,如果修改 public 模式或删除它,可能会导致扩展无法正常工作 能否重命名 public 模式我们能不能通过下面命令对public 模式名重命名 ?
实际上重命名 public 模式是不推荐的做法,原因如下
因此,最好的做法是保留 public 模式,但不在业务中使用它。 如何解决这个问题实际上,我们可以使用迁移的方式,新建一个模式,然后把public模式下的所有业务对象迁移到新建模式下 具体步骤 第一步:创建新的模式
第二步:迁移所有对象:对表、视图、函数、存储过程等对象分别执行 SET SCHEMA 操作,将它们从 public 模式迁移到 employee 模式。 迁移对象时小心依赖关系,如外键、索引、函数依赖等,迁移时需要确保这些依赖关系不被破坏 使用以下命令逐个迁移:
使用 SQL 动态语句和 PL/pgSQL 编写一个循环来批量迁移 public 模式中的所有表、视图、函数和存储过程到 employee 模式。
第三步:设置 search_path 通过调整 search_path 让数据库默认使用 employee 模式。 search_path 的设置顺序非常重要。 将 employee 模式放在前面,确保在业务操作时优先查找 employee 模式的对象,而 public 作为备选模式保留(方便扩展和插件的使用)。 可以修改 PostgreSQL 的 postgresql.conf 文件,或者在会话级别设置 search_path:
第四步:考虑扩展和插件 许多扩展和插件默认使用 public 模式,例如 PostGIS、pgcrypto 等。 为了避免问题,最好不要修改 public 模式,而是保持其作为扩展使用的默认模式。 为什么SQL Server 没有这个问题SQL Server 没有像 PostgreSQL 那样对 public 模式的强烈依赖,并且其设计理念与 PostgreSQL 的 public 模式存在一些关键区别。
在 SQL Server 中,dbo 是默认的 schema,所有数据库用户默认情况下并不会拥有对 dbo 这个 schema 中对象的完全访问权限。只有拥有 db_owner 角色的用户才可以完全控制 dbo 这个 schema。 也就是说,除非用户显式授予对 dbo 中对象的访问或修改权限,否则,普通用户是不能随意访问或修改 dbo 这个 schema 下的对象的。 相比之下,PostgreSQL 的 public 这个 schema 在默认情况下是对所有用户开放的。这意味着所有用户都可以在 public 这个 schema 中创建对象,除非手动限制权限。 PostgreSQL的设计会增加意外权限授予和数据泄露的风险,因此在 PostgreSQL 中有时需要避免使用 public schema。
在 PostgreSQL 中,public schema 设计为一个所有用户共享的默认命名空间,因此经常发生命名冲突、权限管理不严等问题。 在 SQL Server 中,dbo 是为拥有数据库完全控制权的用户预留的默认命名空间,通常普通用户和 DBA 可以自行创建自定义 schema 来组织和隔离各自的数据库对象。 转自https://www.cnblogs.com/lyhabc/p/18475655 该文章在 2025/7/14 9:07:43 编辑过 |
关键字查询
相关文章
正在查询... |