Pla*_*Fan 182 postgresql best-practices postgresql-9.1
我是 Postgres 的新手,正在尝试迁移我们的 MySQL 数据库。在 MySQL 中,我可以向低特权用户授予SELECT、UPDATE、INSERT和DELETE特权,并使这些授权适用于指定数据库中的所有表。我一定在 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的名称, 是用户的名称。
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)