没有超级用户角色无法创建扩展

问题描述 投票:0回答:7

我尝试在 Django 中运行单元测试,它创建了一个新数据库。该数据库具有 postgis 扩展,当我定期创建数据库时,我使用“CREATE ExTENSION postgis”。

但是,当我运行测试时,它给出了以下错误:

$ ./manage.py test
Creating test database for alias 'default'...
Got an error creating the test database: database "test_project" already exists

Type 'yes' if you would like to try deleting the test database 'test_project', or 'no' to cancel: yes
Destroying old test database 'default'...
DatabaseError: permission denied to create extension "postgis"
HINT:  Must be superuser to create this extension.

用户已经拥有创建数据库权限,我在 Ubuntu 12.04 上使用 PostgreSQL 9.1 和 Postgis 2.0。

database postgresql postgresql-9.1
7个回答
147
投票

postgis 上的 Django 文档有一些关于设置数据库用户权限的信息

在最坏的情况下,您可以为 PostgreSQL 创建一个新的数据库超级用户:

$ createuser --superuser <user_name>

或更改现有数据库用户的角色:

postgres# ALTER ROLE <user_name> SUPERUSER;

83
投票

我发现的最简单的方法是:

su postgres
psql
alter role user_name superuser;
#then create the extension as the user in a different screen
alter role user_name nosuperuser;

基本上给用户短期的超级用户权限,并创建扩展。然后撤销超级用户权限。

您还可以使用

\connect user_name
成为该用户并直接从
postgres
用户创建扩展程序。


44
投票

django 文档中建议的另一种解决此问题的方法

$ psql <db name> > CREATE EXTENSION postgis;

您可以以超级用户身份登录数据库并创建一次扩展。然后,该扩展将可供您的 api 的数据库用户使用。当 django 执行时

CREATE EXTENSION IF NOT EXISTS postgis

 postgres 不会抛出。

如果您在迁移时看到错误,请仔细检查您在正确的数据库中创建的扩展,示例会话

$ psql => \l - list databases => \c <db name> - connect to django db => create extension postgis;

如果看到该表,则可以验证扩展是否已安装

spatial_ref_sys



=> \dt List of relations Schema | Name | Type | Owner --------+----------------------------+-------+---------- public | spatial_ref_sys | table | postgres

对于测试,我建议针对本地开发数据库运行它们,并授予用户超级用户能力,例如

> ALTER ROLE <user_name> SUPERUSER;


    


25
投票
您还可以将

postgis

 安装到 
template1
 数据库模板中,默认情况下所有新创建的数据库都会继承该模板。

$ psql -U postgres -d template1 -c "CREATE EXTENSION postgis;"

从此时创建的所有新数据库都将安装

postgis

 扩展,包括 Django 的测试数据库,除非它们在创建数据库时指定不同的模板。

如果不希望将

postgis

 安装到所有新创建的数据库中,您可以创建一个新模板,在其中安装 
postgis
,然后让 Django 在创建测试数据库时使用此模板。

$ createdb template_postgis; # create a new database $ psql -U postgres -c "UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template_postgis';" # make it a template $ psql -U postgres -d template_postgis -c "CREATE EXTENSION postgis;" # install postgis in it

然后在 Django 设置中:

... DATABASES = { 'default': { ... 'TEST': { 'TEMPLATE': 'template_postgis', }, }, }
    

11
投票
从 Postgres 13 开始,某些模块/扩展被视为“可信”,并且可以由对当前数据库拥有

CREATE

 权限的非超级用户安装。

可信模块有:btree_gin、btree_gist、citext、cube、dict_int、fuzzystrmatch、hstore、intarray、is、lo、ltree、pgcrypto、pg_trgm、seg、tablefunc、tcn、tsm_system_rows、tsm_system_time、unaccent、uuid-ossp

要检查给定模块是否符合条件,请访问

https://www.postgresql.org/docs/13/contrib.html 并选择有问题的模块。如果它被认为是“可信的”,该页面将包含以下句子:

该模块被认为是“受信任的”,也就是说,它可以由对当前数据库拥有

CREATE

 权限的非超级用户安装。


6
投票
在不委派超级用户权限的情况下执行此操作的安全方法是访问我们正在其中使用具有超级用户角色的用户(例如 postgres)执行查询的数据库。

$ sudo -u postgres psql <db_name> <db_name>#= CREATE EXTENSION IF NOT EXISTS <your-extension>;
这样您就不会暴露安全性,并且可以相信数据库中的扩展。

GL


0
投票
与问题有些相关,但在 Helm 图表的上下文中:我尝试将

vector

 扩展添加到 
bitnami/postgresql
 Helm 图表。  我能够使用 Dockerfile 
here 创建自定义 Docker 映像,并使用自定义标签对其进行标记 (acme/postgresql:1.0.0
)。

然后,我在 Bitnami Postgres Helm 图表中覆盖如下设置以使用这个新图像:

postgresql: enabled: true auth: postgresPassword: password database: foo image: repository: acme/postgresql tag: 1.0.0 primary: initdb: user: postgres password: password scripts: dbinit.sql: | CREATE USER foo WITH ENCRYPTED PASSWORD 'password'; GRANT USAGE, CREATE ON SCHEMA public TO foo; GRANT ALL PRIVILEGES ON DATABASE foo TO foo; ALTER DATABASE foo OWNER TO foo; \c foo; CREATE EXTENSION vector;
请注意,我运行 

postgres

 脚本的 
dbinit.sql
 用户是超级用户。

这里很重要的一点是

\c foo

线。  如果没有这个,
vector
扩展就不会安装,因为 Postgres 不知道要安装在哪个数据库上。

© www.soinside.com 2019 - 2024. All rights reserved.