【问题标题】:"ERROR: must be member of role" When creating schema in PostgreSQL“错误:必须是角色成员”在 PostgreSQL 中创建模式时
【发布时间】:2014-12-28 08:41:27
【问题描述】:

我使用超级用户帐户登录,这是我正在执行的过程:

1-> CREATE ROLE test WITH IN ROLE testroles PASSWORD 'testpasswd'
2-> CREATE SCHEMA AUTHORIZATION test

角色已正确创建,但在尝试创建架构时出现此错误:

ERROR:  must be member of role "test"

【问题讨论】:

标签: postgresql roles


【解决方案1】:

我遇到了同样的问题,它抱怨您登录的当前(主)用户不是您尝试为其创建架构的用户组的成员。您应该将角色访问权限授予您的主用户,它可以让您创建 SCHEMA 而不会出错:

GRANT <role> TO <master_user>;

【讨论】:

    【解决方案2】:

    我在 Amazon RDS 上使用 CREATE DATABASE 时遇到了这个问题。我认为这与使用CREATE SCHEMA基本相同。

    使用 Amazon RDS 时,发出 CREATE DATABASE 的用户必须是将成为数据库所有者的角色的成员。在我的例子中,我使用的超级用户帐户名为root,我将创建一个角色o,该角色将拥有一个数据库d

    postgres=> CREATE ROLE o;
    CREATE ROLE
    
    postgres=> CREATE DATABASE d OWNER = o;
    ERROR:  must be member of role "o"
    
    postgres=> GRANT o TO root;
    GRANT ROLE
    
    postgres=> CREATE DATABASE d OWNER = o;
    CREATE DATABASE
    

    【讨论】:

    • 同样的事情,但我发现新用户不需要拥有 CREATEDB 权限。我创建了一个普通用户,将该用户角色授予我的管理员用户,然后使用管理员用户创建数据库,并将所有者设置为普通用户。
    • 这里有一篇简短的文章描述了这种对 RDS 的影响的原因。blog.2ndquadrant.com/the-rds_superuser-role-isnt-that-super
    • 我在 Google Cloud SQL for PostgreSQL 上遇到了同样的错误,这个答案是解决方案,除了我在创建数据库之前运行了 GRANT o TO postgres;
    • 警告在为该用户启用 IAM 身份验证之前,不要忘记使用postgres 删除该用户的角色REVOKE。否则,在您禁用 RDS 中的 IAM 身份验证之前,您将无法使用用户 postgres 连接到数据库。
    【解决方案3】:

    我通过使用postgres 用户登录来修复它(然后应用我的更改,这在我的情况下正在更改所有权):

    sudo -u postgres psql
    ALTER DATABASE my_database OWNER TO new_user;
    

    【讨论】:

      【解决方案4】:

      我刚刚使用 Amazon RDS 遇到了这个问题。

      很多答案已经是正确的,但你也可以改变角色。

      这是我的实现

      psql -h ${PGHOST} -p ${PGPORT:-5432} -U ${PGUSER:-postgres} -c "ALTER USER renderer WITH CREATEDB PASSWORD '$RENDERPASSWORD'"

      所以在修改密码的同时,我也在给角色添加CREATEDB角色权限。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。为了解决这个问题,我使用新创建的角色登录并创建了数据库。 不知何故,grant 在 RDS Postgres 中不起作用。

        【讨论】:

          【解决方案6】:

          我在 RDS 上也遇到过这个问题。我以root 用户身份登录,创建了一个名为myappuser 的角色,然后尝试创建一个名为superduper 的架构,其所有者为myappuser

          我找到了一个可行的解决方案。创建myappuser角色,并确保该角色至少具有创建数据库的权限(该权限称为CREATEDB)。创建myappuser 角色后,我以myappuser 身份登录数据库并创建superduper 架构,其用户为myappuser。这没有任何问题。

          【讨论】:

            【解决方案7】:

            难道我们只需要将管理员用户成员资格授予服务角色吗?

            create role service_role with password 'some_password';
            create database service_db with owner service_role;
            ERROR:  must be member of role "service_role"
            grant admin_user service_role;
            GRANT ROLE
            create database service_db with owner service_role;
            CREATE DATABASE
            

            【讨论】:

            • 在 Postgres 9.0 及更高版本中授予包括“TO”:GRANT service_role TO admin_user;
            【解决方案8】:

            RDS 也有这个问题。

            解决它:

            以超级用户身份登录

            psql --host=xxxxxxx.rds.amazonaws.com --port=5432 --username=RDS_SUPERUSER_NAME --password --dbname=postgres
            

            创建用户

            CREATE USER newuser WITH CREATEDB PASSWORD 'password';
            

            退出

            \q
            

            newuser登录

            psql --host=xxxxxxx.rds.amazonaws.com --port=5432 --username=newuser --password --dbname=postgres
            

            创建您的数据库/架构

            CREATE SCHEMA/DATABASE ....
            

            【讨论】:

              【解决方案9】:

              您在使用 RDS 吗?因为当我以他们为您创建的“超级用户”身份登录时,我遇到了同样的问题。我能够解决这个问题的方法是创建一个新的组角色,其中包括我的超级用户和拥有架构的用户。所以对你来说,这意味着将你的超级用户和测试用户添加到一个新的角色组:

              CREATE ROLE users NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
              GRANT megausers TO testroles;
              GRANT test TO testroles;
              

              现在你应该可以创建你的 schmea

              【讨论】:

              猜你喜欢
              • 2021-05-21
              • 2016-03-21
              • 1970-01-01
              • 1970-01-01
              • 2018-08-07
              • 2018-03-31
              • 2012-06-25
              • 2019-09-17
              • 1970-01-01
              相关资源
              最近更新 更多