Install extension in PostgreSQL database via migration?

时间:2015-09-01 22:11:01

标签: postgresql security sequelize.js

We are using migrations (via Sequelize, in JavaScript) to maintain changes to our database. I have a need to add a CREATE EXTENSION call but since I am running as the database creator, and not superuser, I get a permission denied to create extension.

Is there a way to modify security on a single database to allow a user to install an extension via a migration file? IOW, when I create the "naked" database and apply my permissions, can I set security up to allow CREATE EXTENSION and DROP EXTENSION for a specific user?

3 个答案:

答案 0 :(得分:1)

不,对于粒度CREATE/DROP EXTENSION控件,CREATE ROLE没有设置。我假设,这取决于您使用的扩展程序,但您基于documentation

  

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

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

答案 1 :(得分:0)

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

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

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

更复杂的命令行带来的不便因为"特殊"需要这种隔离的迁移也使它们变得更加明显。

答案 2 :(得分: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;');
  }
};