pgadmin:获取" DETAIL:用户没有CONNECT权限。"错误

时间:2016-08-26 15:00:03

标签: postgresql connect privileges pgadmin

我在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.

2 个答案:

答案 0 :(得分:11)

当前对象的权限

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

  1. DATABASE
  2. SCHEMA
  3. 表,功能,序列等
  4. 首先,您需要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 <schemaname>并将其应用于您将来拥有或创建的任何架构。但同样,要小心,即使你没有提供FOR ROLE <rolename>,这意味着它将适用于当前连接的用户,因此只创建了由<rolename>将考虑ADP命令。

    为了更好地管理权限,我强烈建议您密切关注哪些用户拥有这些对象。在大多数情况下,我还建议您只为数据库内的所有内容保留一个所有者(除非您是高级用户并知道您在做什么),这样就可以更轻松地进行权限管理。

答案 1 :(得分:0)

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

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