通过迁移在PostgreSQL数据库中安装扩展,不需要超级用户角色



我们正在使用迁移(通过JavaScript中的Sequelize)来维护对数据库的更改。我需要添加一个CREATE EXTENSION调用,但由于我是作为数据库创建者运行的,而不是超级用户,所以我得到了一个permission denied to create extension

是否有一种方法可以修改单个数据库的安全性,以允许用户通过迁移文件安装扩展?那么,当我创建"裸"数据库并应用我的权限时,我可以设置安全性以允许特定用户使用CREATE EXTENSIONDROP EXTENSION吗?

不,粒度CREATE/DROP EXTENSION控件没有CREATE ROLE设置。我认为,这取决于您使用的扩展,但您基于文档:

加载扩展需要相同的权限需要创建它的组件对象。对于大多数扩展来说意味着需要超级用户或数据库所有者权限。用户运行CREATE EXTENSION成为扩展的所有者以后的特权检查,以及创建的任何对象的所有者

我在pg_trgm扩展中遇到了同样的问题,但即使将角色设置为数据库所有者也没有解决这个问题。

对于仍然在寻找的人,这里是如何通过序列化迁移创建扩展。然而,它没有解决用户角色的次要问题。但这对我有用。

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.sequelize.query('CREATE EXTENSION extensionName;');
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.sequelize.query('DROP EXTENSION extensionName;');
  }
};

无法在迁移文件中执行此操作。

我们最终使用的技术是在迁移文件夹中有一个名为postgres的子文件夹,用于保存必须以超级用户身份运行的任何内容。子文件夹包含迁移和一个配置文件,用于作为超级用户运行程序。因此,命令行变成:

$ sequelize db:migrate --migrations-path "migrations/postgres" --config "migrations/postgres"
$ sequelize db:migrate

需要这种隔离的"特殊"迁移也使它们更加明显,这一事实减轻了更复杂命令行带来的不便。

最新更新