【问题标题】:pgadmin: getting "DETAIL: User does not have CONNECT privilege." errorpgadmin:获取“详细信息:用户没有 CONNECT 权限。”错误
【发布时间】:2020-04-19 19:19:26
【问题描述】:

我在 Mac Yosemite 上使用 pgAdmin III。我创建了一个角色“折扣”,并创建了一个数据库“折扣”。在 pgadmin 工具中,我如何给用户“折扣”连接权限(和表读/写权限)到数据库“折扣”?目前,当我尝试在命令行登录时出现此错误

davea$ psql -h localhost -d discount -U discount
Password for user discount: 
psql: FATAL:  permission denied for database "discount"
DETAIL:  User does not have CONNECT privilege.

【问题讨论】:

  • 您可以使用GRANT命令授予权限here是官方文档
  • 此链接与pgadmin工具无关
  • 我认为这个问题也与 pgAdmin III 无关。如果您愿意,可以使用 pgAdmin III 发出缺少的 GRANT 语句。
  • 您的问题与 pgadmin 不同,但它与权限有关,因此我为您提供了如何向用户授予适当权限的方式,以便用户有权访问数据库。

标签: postgresql connect privileges pgadmin


【解决方案1】:

对当前对象的权限

要拥有对表的读/写权限,您需要在 3 个级别使用GRANT command

  1. 数据库
  2. 架构
  3. 表格、函数、序列等

首先,您需要数据库的CONNECT 权限:

GRANT CONNECT ON DATABASE <dbname> TO <username>;

其次,您需要对数据库内部的架构具有USAGE 权限(您必须在运行之前连接到数据库):

GRANT USAGE ON SCHEMA <schemaname> TO <username>;

最后,您可以授予表的权限,假设您希望对架构中的所有表进行通用 DML 和 SELECT 以及其他权限:

GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA <schemaname> TO <username>;
-- and the sequences, for INSERT to work
GRANT USAGE ON ALL SEQUENCES IN SCHEMA <schemaname> TO <username>;
-- and the functions
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA <schemaname> TO <username>;

未来创建的对象的默认权限

您现在必须注意到一些事情。每个数据库、每个模式和每个对象(表、函数等)都有一个所有者。的所有者是将在其上管理和运行 DDL 命令的用户。通常,您应该以拥有一切的用户身份运行上述所有命令,因为该用户已经拥有所有权限(您也可以使用SUPERUSER,但我建议仅将其保留用于 DBA 任务)。

上述GRANT ... ON ALL ... IN SCHEMA 命令将授予数据库中已存在的对象的权限,但不适用于创建的新对象。为此,您可以使用ALTER DEFAULT PRIVILEGES (I'll call it ADP) command。和以前一样,您应该在以所有者身份连接时运行它,因为您必须记住,只有当新对象的所有者与此处使用的所有者匹配(或在 FOR ROLE clause 中设置)时才会应用 ADP:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
    GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO <username>;
-- and the sequences, for INSERT to work
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
    GRANT USAGE ON SEQUENCES TO <username>;
-- and the functions
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname>
    GRANT EXECUTE ON FUNCTIONS TO <username>;

您也可以从上面跳过IN SCHEMA &lt;schemaname&gt;,并将其应用于您拥有或将来创建的任何架构。但同样,要小心,即使您不提供FOR ROLE &lt;rolename&gt;,这意味着它将应用于当前连接的用户,因此只有创建的对象属于该@ 987654338@会考虑ADP命令。

为了更好地管理权限,我强烈建议您留意哪些用户拥有这些对象。在大多数情况下,我还建议您只为数据库中的所有内容保留一个所有者(除非您是高级用户并且知道自己在做什么),这样权限管理会更容易。

【讨论】:

    【解决方案2】:

    确保验证您尝试连接的数据库名称。我最初也遇到了同样的问题,后来才发现我正在连接到不同的数据库。

    The one having the yellow-colored symbol will be your database.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多