【问题标题】:permission denied to create extension "uuid-ossp"创建扩展“uuid-ossp”的权限被拒绝
【发布时间】:2014-03-03 00:43:39
【问题描述】:

我正在 postgresql 上构建一个 Rails 项目,但是当我

rake db:migrate

我收到以下错误:

 permission denied to create extension "uuid-ossp"

这是我的 database.yml 的样子:

app_common: &app_common
adapter: postgresql
host: 127.0.0.1
port: 5432
encoding: unicode
pool: 5
username: root
password:

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    想通了,我需要 postegresql 并将 root 角色更改为超级用户:

    $psql
    
    ALTER USER root WITH SUPERUSER;
    

    【讨论】:

    • 这似乎可行,但我可能想建议谨慎。将用户添加为超级用户允许他创建其他用户,因此这可能会成为安全问题。
    • 成为?这是鲁莽的。你愿意为一个简单的任务打开一个安全漏洞。如果您有权更改用户,只需启用扩展程序即可。
    【解决方案2】:

    ALTER USER root WITH SUPERUSER 如果数据库的用户是 root 但如果不是,则需要先以超级用户身份运行 psql,然后再运行此命令以便运行

    sudo -u postgres psql postgres

    然后

    ALTER USER mydb_user WITH SUPERUSER;

    【讨论】:

    • 我不明白这不是正确答案,虽然两个答案几乎相同,而且这个是 4 个月前发布的。
    • @AbibullahRahamathulah “正确答案”发布于 2014 年 3 月 3 日。此答案发布于 2014 年 12 月 21 日。因此“正确答案”实际上是在此答案前 9 个月发布的。
    【解决方案3】:

    或者,从 Postgresql 13 开始,在当前数据库上拥有 CREATE 权限的角色可以安装受信任的扩展而不是 SUPERUSER

    来自Postgresql documentation

    加载扩展通常需要创建其组件对象所需的相同权限。对于许多扩展,这意味着需要超级用户权限。
    但是,如果扩展在其控制文件中被标记为受信任,则任何对当前数据库具有CREATE 权限的用户都可以安装它。
    在这种情况下,扩展对象本身将由调用用户拥有,但包含的对象将由引导超级用户拥有(除非扩展脚本明确地将它们分配给调用用户)。此配置使调用用户有权删除扩展,但不能修改其中的单个对象。

    根据您的安装,受信任的扩展至少应如下所示:

    btree_gin btree_gist citext cube dict_int fuzzystrmatch hstore intarray isn lo ltree pgcrypto pg_trgm plpgsql seg tablefunc tcn tsm_system_rows tsm_system_time unaccent uuid-ossp

    您可以再次根据您的安装情况检查或切换/usr/local/share/postgresql/extension/*.control 文件中的trusted 标志。

    提供一个带有数据库 maindb 和两个角色的 PostgreSQL 实例:

    • postgres(默认超级用户)
    • jack(有限权限)
    $ psql -U jack -d maindb
    
    maindb=>CREATE EXTENSION plpgsql;
    
    ERROR:  permission denied to create extension "plpgsql"
    
    HINT:  Must have CREATE privilege on current database to create this extension.
    
    maindb=> \q
    

    显然jack 无法将扩展名添加到maindb,现在让我们给他们正确的权限,然后再试一次:

    $ psql -U postgres 
    
    postgres=# GRANT CREATE ON DATABASE maindb to jack;
    GRANT
    postgres=# \q
    
    $ psql -U jack -d maindb
    
    maindb=>CREATE EXTENSION plpgsql;
    CREATE EXTENSION
    

    瞧,不再需要给SUPERUSER 特权(无论如何你都不应该这样做)。

    【讨论】:

    • 这不适用于 Amazon RDS。我在 RDS 上使用 UUID (CREATE EXTENSION IF NOT EXISTS "uuid-ossp";) 创建数据库而不使用 prostgres。知道怎么做吗?
    【解决方案4】:

    解决方案:

    1. ALTER USER root WITH SUPERUSER;

    2. 使用 PGADMIN,步骤:

      localhost -> 登录角色 -> 右键单击角色,即 postgres -> ** 在角色权限选项卡中** -> 检查超级用户 -> 确定

    享受吧。

    【讨论】:

      【解决方案5】:

      对于 DBeaver,

      右击 DB -> 查看数据库 -> 在属性下转到标签 Roles -> 选择用户并为其分配角色。

      对于超级用户角色,将超级用户角色分配给其他用户B的用户A,用户A应该是超级用户本身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-24
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 2022-01-19
        • 2022-08-12
        • 2019-01-20
        相关资源
        最近更新 更多