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?
答案 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;');
}
};