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

Pla*_*Fan 182 postgresql best-practices postgresql-9.1

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

这是如何最好地完成的?

dez*_*zso 205

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

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

这些假设您将只有一个架构(默认情况下名为“public”)。

正如 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;
Run Code Online (Sandbox Code Playgroud)

在这里,some_role是创建表的角色,同时user_name是获得特权的角色。定义这个,你必须作为some_role它的成员或它的成员登录。

最后,你必须对序列做同样的事情(感谢 PlaidFan 指出)——这是USAGE你需要的特权。


小智 58

假设你想给他们所有的特权 - 这样做:

grant all privileges on database dbname to dbuser;
Run Code Online (Sandbox Code Playgroud)

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

  • 这将在 _database_ 上添加以下权限:`CREATE、CONNECT、TEMPORARY`。没有表的特权。 (60认同)
  • 所有表的类似命令是,`GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;` (19认同)
  • 我发现这也很有用:`GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;` (8认同)

Gan*_*ukh 32

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

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
Run Code Online (Sandbox Code Playgroud)


小智 22

可能是我在这里做错了,因为我对 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;
Run Code Online (Sandbox Code Playgroud)


小智 6

--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;
Run Code Online (Sandbox Code Playgroud)