我们正在使用迁移(通过JavaScript中的Sequelize)来维护对数据库的更改。我需要添加一个CREATE EXTENSION
调用,但由于我是作为数据库创建者运行的,而不是超级用户,所以我得到了一个permission denied to create extension
。
CREATE EXTENSION
和DROP 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
需要这种隔离的"特殊"迁移也使它们更加明显,这一事实减轻了更复杂命令行带来的不便。