我在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.
答案 0 :(得分:11)
要拥有对表的读/写权限,您需要在3个级别中使用GRANT
command:
首先,您需要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.