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

Dav*_*ave 6 postgresql privileges connect 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.
Run Code Online (Sandbox Code Playgroud)

Mat*_*sOl 11

当前对象的权限

要对表进行读/写访问,需要使用3个级别的GRANT命令:

  1. 数据库
  2. SCHEMA
  3. 表格,功能,序列等

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

GRANT CONNECT ON DATABASE <dbname> TO <username>;
Run Code Online (Sandbox Code Playgroud)

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

GRANT USAGE ON SCHEMA <schemaname> TO <username>;
Run Code Online (Sandbox Code Playgroud)

最后,您可以为表提供权限,假设您希望在架构中的所有表上使用通用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>;
Run Code Online (Sandbox Code Playgroud)

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

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

上述GRANT ... ON ALL ... IN SCHEMA命令将为已存在于数据库中的对象提供权限,但不会应用于创建的新对象.为了做到这一点,你可以使用ALTER DEFAULT PRIVILEGES(我称之为ADP)命令.和以前一样,您应该在作为所有者连接时运行它,因为您必须记住,只有当新对象的所有者与此处使用的所有者匹配(或在FOR ROLE子句中设置)时才应用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>;
Run Code Online (Sandbox Code Playgroud)

您也可以IN SCHEMA <schemaname>从上面跳过并将其应用于您将来拥有或创建的任何架构.但是,请注意,即使您没有提供FOR ROLE <rolename>这意味着它将应用于当前连接用户,因此只有创建的对象<rolename>才会考虑ADP命令.

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