我想为用户提供数据库的所有权限,而不是将其作为管理员。 我想要这样做的原因是,目前DEV和PROD是同一集群上的不同数据库,所以我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象
我试过了:
grant ALL on database MY_DB to group MY_GROUP;
但它似乎没有给予任何许可。
然后我尝试了:
grant all privileges on schema MY_SCHEMA to group MY_GROUP;
它似乎允许我创建对象但不能查询该架构上属于其他用户的\ delete对象
我可以继续在MY_SCHEMA上向用户授予USAGE权限但是它会抱怨没有权限在桌面上...
所以我想我的问题是:是否有任何简单的方法可以在数据库上为用户提供所有权限?
我正在研究PostgreSQL 8.1.23。
答案 0 :(得分:184)
用户需要访问数据库,显然:
GRANT CONNECT ON DATABASE my_db TO my_user;
并且(至少)架构的USAGE
权限:
GRANT USAGE ON SCHEMA public TO my_user;
然后,所有表的所有权限(需要Postgres 9.0 或更高版本):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
不要忘记序列(如果有的话):
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
对于旧版本,您可以使用pgAdmin III(默认GUI)的“授予向导”。
更多:
但实际上,你应该upgrade to a current version。
答案 1 :(得分:100)
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
答案 2 :(得分:46)
在PostgreSQL 9.0+中,您将执行以下操作:
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;
如果要为新创建的关系启用此功能,请设置默认权限:
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,你必须自己编写代码:
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;
这将设置所有关系的权限:表,视图,索引,序列等。如果要限制它,请在pg_class.relkind
上进行过滤。有关详细信息,请参阅pg_class docs。
您应该以超级用户身份运行此功能,并按照应用程序的要求运行此功能。一个选项是将其打包在每天或每小时执行的cron作业中。
答案 3 :(得分:18)
我做了以下添加角色' eSumit'在PostgreSQL 9.4.15数据库上并提供此角色的所有权限:
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:
答案 4 :(得分:5)
在 PostgreSQL 12 及更高版本中,可以将数据库中表的所有权限授予角色/用户/帐户。
语法是:
GRANT ALL ON table_name TO role_name;
如果您想将其授予数据库中的所有表,则语法为:
GRANT ALL ON ALL TABLES TO role_name;
如果您想将其授予数据库中某个模式的所有表,则语法为:
GRANT ALL ON ALL TABLES IN SCHEMA schema_name TO role_name;
注意:请记住,您需要先选择数据库,然后才能将其权限授予用户。
就这些
我希望这会有所帮助
答案 5 :(得分:0)
SCHEMA schema_name TO用户上的GRANT使用情况;
答案 6 :(得分:0)
GRANT ALL ON SCHEMA schema_name TO user_name;