Give all the permissions to a user on a DB
我想为用户提供数据库的所有权限,而不是将其作为管理员。
我想这样做的原因是,目前DEV和PROD是同一集群上的不同DB,因此我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象。
我试过了:
1 | GRANT ALL ON DATABASE MY_DB TO GROUP MY_GROUP; |
但它似乎没有给予任何许可。
然后我尝试了:
1 | GRANT ALL privileges ON schema MY_SCHEMA TO GROUP MY_GROUP; |
它似乎允许我创建对象,但不允许查询属于其他用户的该架构上的 delete对象
我可以继续在MY_SCHEMA上向用户授予USAGE权限,但是它会抱怨没有权限在桌子上......
所以我想我的问题是:是否有任何简单的方法可以在数据库上为用户提供所有权限?
我正在研究PostgreSQL 8.1.23。
用户显然需要访问数据库:
1 | GRANT CONNECT ON DATABASE my_db TO my_user; |
并且(至少)架构的
1 | GRANT USAGE ON SCHEMA public TO my_user; |
然后,所有表的所有权限(需要Postgres 9.0或更高版本):
1 | GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user; |
并且不要忘记序列(如果有的话):
1 | GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user; |
对于旧版本,您可以使用pgAdmin III(默认GUI)的"授予向导"。
更多:
- 如何在DATABASE与SCHEMA上管理用户的DEFAULT PRIVILEGES?
- 授予PostgreSQL中特定数据库的权限
- 如何将视图的所有权限授予任意用户
但实际上,您应该升级到当前版本。
1 | GRANT ALL PRIVILEGES ON DATABASE"my_db" TO my_user; |
在PostgreSQL 9.0+中,您将执行以下操作:
1 2 | GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP; |
如果要为新创建的关系启用此功能,请设置默认权限:
1 2 3 4 | ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP; ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP; |
但是,看到你使用8.1,你必须自己编写代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS INTEGER AS $$ DECLARE rel RECORD; BEGIN FOR rel IN SELECT c.relname FROM pg_class c JOIN pg_namespace s ON c.namespace = s.oid WHERE s.nspname = schname LOOP EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to); END LOOP; RETURN 1; END; $$ LANGUAGE plpgsql STRICT; REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC; |
这将设置所有关系的权限:表,视图,索引,序列等。如果要限制它,请过滤
您应该以超级用户身份运行此功能,并按照应用程序的要求运行。一个选项是将其打包在每天或每小时执行的cron作业中。
我做了以下操作,在PostgreSQL 9.4.15数据库中添加了一个角色'eSumit',并为此角色提供了所有权限:
1 2 3 4 5 6 7 | CREATE ROLE eSumit; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit; GRANT ALL PRIVILEGES ON DATABASE"postgres" TO eSumit; ALTER USER eSumit WITH SUPERUSER; |
还通过以下方式检查了pg_table enteries:
select * from pg_roles;
数据库查询快照: