通过迁移在PostgreSQL数据库中安装扩展名而没有超级用户角色?

问题描述 投票:2回答:3

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

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

postgresql security sequelize.js
3个回答
1
投票

否,没有用于CREATE ROLE精细控制的CREATE/DROP EXTENSION设置。我认为,这取决于您使用的扩展名,但是您基于documentation

加载扩展程序所需的特权与创建其组件对象所需。对于大多数扩展,表示需要超级用户或数据库所有者特权。用户谁运行CREATE EXTENSION成为扩展的所有者以后的特权检查以及创建的任何对象的所有者通过扩展程序的脚本。

我遇到了pg_trgm扩展名的同一问题,但是即使将角色设置为数据库所有者也无法解决该问题。


0
投票

找不到在迁移文件中执行此操作的方法。

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

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

[由于需要这种隔离的“特殊”迁移也使它们更加明显,因此减轻了更复杂的命令行带来的不便。


0
投票

对于仍在寻找的人,这是如何通过顺序迁移创建扩展。但是,它没有解决用户角色的第二个问题。但这对我有用。

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.sequelize.query('CREATE EXTENSION extensionName;');
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.sequelize.query('DROP EXTENSION extensionName;');
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.