不能创建没有超级用户角色的扩展

我尝试在 Django 中运行单元测试,它创建了一个新的数据库。数据库有 postgis 扩展,当我定期创建数据库时,我使用“ CREATEExTENSON 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.

用户已经拥有 Create DB 特权,我在 Ubuntu 12.04上使用 PostgreSQL 9.1和 Postgis 2.0。

93125 次浏览

关于 postgis 的 Django 文档提供了一些关于设置用户权限 的信息。

在最坏的情况下,你可以创建一个新的超级用户:

$ createuser --superuser <user_name>

或改变现有用户的角色:

postgres# ALTER ROLE <user_name> SUPERUSER;

我发现最简单的方法是:

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用户创建扩展。

另一种解决这个问题的方法是在 姜戈医生中提出的

$ psql <db name>
> CREATE EXTENSION postgis;

您可以作为超级用户登录到数据库并创建一次扩展。这个扩展将对 api 的 db 用户可用。当 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

对于测试,我建议针对本地 dev 数据库运行它们,并赋予用户超级用户 > ALTER ROLE <user_name> SUPERUSER;之类的能力

您还可以将 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

然后在姜戈设置中:

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

不委派超级用户权限的一种安全方法是访问数据库,在这个数据库中,我们使用具有超级用户角色(如 postgres)的用户执行查询。

$ sudo -u postgres psql <db_name>


<db_name>#= CREATE EXTENSION IF NOT EXISTS <your-extension>;

这样就不会暴露安全性,并且可以相信 db 中的扩展。

GL

在 Postgres 13中,一些模块/扩展被认为是“可信的”,可以由在当前数据库中拥有 CREATE特权的非超级用户安装。

受信任的模块是: btree _ gin、 btree _ gist、 citext、多维数据集、 dict _ int、 fuzzystrmatch、 hstore、 intarray、 isn、 lo、 ltree、 pgcrypto、 pg _ trgm、 seg、 tablefunc、 tcn、 tsm _ system _ rows、 tsm _ system _ time、 un争议发音、 uuid-ossp

要检查给定的模块是否合格,请访问 https://www.postgresql.org/docs/13/contrib.html并选择有问题的模块。如果它被认为是“值得信任的”,页面将包含以下句子:

这个模块被认为是“可信的”,也就是说,它可以由在当前数据库上拥有 CREATE特权的非超级用户安装。