授予用户对所有表的访问权限


151

我是Postgres的新手,正尝试迁移我们的MySQL数据库。在MySQL中我可以授予SELECTUPDATEINSERT,和DELETE在低特权用户的权限,使这些赞助适用于所有表中指定的数据库。我必须在Postgres中缺少一些东西,因为看起来我必须一次为每个表授予一次这些特权。拥有很多数据库,每个数据库有数百个表,这似乎是一项艰巨的任务,只是要起步。此外,一旦数据库开始运行,添加表的频率就足够频繁了,除非绝对必要,否则我不想每次都授予权限。

如何做到最好?

Answers:


175

首先,您必须能够连接到数据库才能运行查询。这可以通过

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

REVOKE是必要的,因为

关键字PUBLIC表示将特权授予所有角色,包括以后可能创建的角色。可以将PUBLIC视为一个隐式定义的组,该组始终包含所有角色。任何特定角色都将具有直接授予它的特权,授予它当前所属的任何角色的特权以及授予PUBLIC的特权的总和。

如果您确实想将用户限制为DML语句,那么您还有更多工作要做:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

这些假定您将只有一个模式(默认情况下称为“公共”)。

正如杰克·道格拉斯(Jack Douglas)所指出的那样,以上内容仅赋予了已经存在的表特权。要为将来的表实现相同的功能,必须定义默认权限

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

some_role是创建表的角色,而user_name获得特权的角色是表。定义此权限后,您必须以some_role或其成员身份登录。

最后,您必须对序列执行相同的操作(感谢PlaidFan指出)-这是USAGE您需要的特权。


1
谢谢,这FOR some_role是我无法使它适用于以后创建的表的关键部分。但是,我不必以身份登录,some_role如果我以默认管理员postgres用户身份执行查询,它也可以正常工作。
JustAMartin

54

假设您想赋予他们所有特权-请执行以下操作:

grant all privileges on database dbname to dbuser;

where dbname是您的数据库dbuser的名称,是用户的名称。


44
这将在数据库上添加以下特权:CREATE, CONNECT, TEMPORARY。在表上没有特权。
dezso

13
对于所有表,类似的命令是:GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
我发现这也很有用:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

向数据库中的所有表授予所有特权是通过

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

可能是因为我对PostgreSQL很陌生,所以我在这里做错了。但这对我来说仅解决了问题的第一部分-在所有现有表上设置特权。

为了在创建的新表上为我的用户正确设置权限,我必须为用户设置默认权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.