代码之家  ›  专栏  ›  技术社区  ›  Shubham B

[错误:架构公共位置的权限被拒绝:14]

  •  0
  • Shubham B  · 技术社区  · 2 年前

    我正在使用postgresql 15,并尝试运行以下命令:

    grant all privileges on database my_database to my_database_user;
    grant all privileges on all tables in schema public to my_database_user;
    grant all privileges on all sequences in schema public to my_database_user;
    grant all privileges on all functions in schema public to my_database_user;
    

    但当我跑步时:

    php artisan migrate --seed 
    

    我得到:

    SQLSTATE[42501]:权限不足:7错误:在字符14处拒绝架构公共的权限(SQL:创建表“migrations”(“id”串行主键不为空,“migration”varchar(255)不为空、“batch”整数不为空)

    我错过了什么?

    我确实确保.env具有正确的凭据:

    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=my_database
    DB_USERNAME=my_database_user
    DB_PASSWORD=password
    

    检查我是否做到了:

    postgres=# \du my_database_user
                List of roles
      Role name  | Attributes | Member of 
    -------------+------------+-----------
     my_database_user |            | {}
    

    以及:

    postgres=# SELECT * FROM pg_roles;
              rolname          | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |  oid  
    ---------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+-------
     my_database_user               | f        | t          | f             | f           | t           | f              |           -1 | ********    |               | f            |           | 16389
    
    0 回复  |  直到 1 年前
        1
  •  27
  •   Laurenz Albe    1 年前

    您缺少对架构的权限:

    GRANT CREATE ON SCHEMA public TO my_database_user;
    

    您可能正在使用PostgreSQL v15或更高版本。上的默认权限 public v15中的模式已更改。以前,不安全的默认设置是允许每个人( PUBLIC )在模式中创建对象 公众的 。现在只有数据库所有者可以这样做,除非您授予额外的权限。

    在授予权限时,请确保连接到正确的数据库,因为每个数据库都有自己的架构。

        2
  •  4
  •   Strato80    1 年前

    为了补充Laurenz的回答,这是为那些可能像我一样从脚本中执行此操作的人准备的。

    由于在这样的查询中指定数据库是不可能的(作为前缀,我最初认为这是合乎逻辑的: <db_name>.<schema_name> ),您首先需要连接到目标数据库(使用 \c <db_name> ),然后执行查询。如果没有,它将默默地向连接的任何数据库上下文授予创建权限(在我的例子中,是Postgres)。

        3
  •  4
  •   SyntaxGoonoo    1 年前

    执行以下操作:

    • 使用具有超级用户权限的用户登录psql。
    • 更改到目标数据库
    • 将“public”架构上的CREATE授予目标用户

    例如:

    $ sudo -u postgres psql
    postgres=# \c dbname 
    postgres=# GRANT CREATE ON SCHEMA public TO username;