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

时间:2013-05-13 17:31:26

标签: django postgresql postgresql-9.1 postgis

我正在尝试在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.

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

6 个答案:

答案 0 :(得分:81)

The Django documentation on postgis has some information on setting up user privileges

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

$ createuser --superuser <user_name>

或更改现有用户的角色:

postgres# ALTER ROLE <user_name> SUPERUSER;

答案 1 :(得分:37)

我发现最简单的方法是:

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

答案 2 :(得分:5)

django docs

中建议的另一种解决方法
$ 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

对于测试,我建议针对本地开发数据库运行它们,并授予用户超级用户权限,例如> ALTER ROLE <user_name> SUPERUSER;

答案 3 :(得分:2)

您还可以将postgis安装到template1数据库模板中,该模板默认情况下由所有新创建的数据库继承。

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

此后创建的所有新数据库都将安装postgis扩展名,包括Django的测试数据库,除非它们在创建数据库时指定了不同的模板。

如果不希望将postgis安装到所有新创建的数据库中,则可以创建一个新模板,在其中安装postgis,然后让Django在创建测试数据库时使用此模板。 / p>

$ 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',
        },
    },
}

答案 4 :(得分:0)

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

fn get_length(head: &Option<Box<ListNode>>) -> usize {
    let mut res = 0;
    let mut current_node = head;
    while current_node.is_some() {
        current_node = &current_node.as_ref().unwrap().next;
        res += 1;
    }
    res
}

fn split(mut head: Option<Box<ListNode>>, len: usize) -> (Option<Box<ListNode>>, Option<Box<ListNode>>) {
    let mut curr = head.take();
    for _ in 0..len {
        let mut curr_inner = curr.unwrap();
        curr = curr_inner.next.take();
    }
    (head, curr.take())
}

let len = get_length(&node);
let (l1, l2) = split(node, len / 2 + len % 2);

这样,您就不会暴露安全性,并且可以相信数据库中的扩展名。

GL

答案 5 :(得分:0)

从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-os / p>

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

该模块被认为是“受信任的”,也就是说,可以由对当前数据库具有CREATE特权的非超级用户安装该模块。