将所有权限授予数据库上的用户

我想给一个用户一个数据库的所有权限,而不使其成为一个pipe理员。 我想这样做的原因是,目前DEV和PROD是同一个集群上不同的DB,所以我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象。

我试过了:

grant ALL on database MY_DB to group MY_GROUP; 

但似乎没有给予任何许可。

然后我试着:

 grant all privileges on schema MY_SCHEMA to group MY_GROUP; 

它似乎让我有权创build对象,而不是查询\删除属于其他用户的架构上的对象

我可以在MY_SCHEMA上向用户提供USAGE权限,但是会抱怨没有权限在桌面上…

所以我想我的问题是:是否有任何简单的方法将所有权限授予数据库上的用户?

我正在使用PostgreSQL 8.1.23。

您至less需要在架构上USAGE特权。

这个DDL命令需要Postgres 9.0或更高版本:

 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser; 

对于旧版本,您可以使用pgAdmin的“授权向导”(默认GUI)。
更多细节:

  • 如何在DATABASE vs SCHEMA上为用户pipe理DEFAULT PRIVILEGES?
  • 授予PostgreSQL中特定数据库的权限
  • 如何将视图的所有权限授予任意用户

但是,真的,你应该升级到最新版本 。

 GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user; 

在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; 

如果您想为新创build的关系启用此function,请设置默认权限:

 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文档 。

您应该以超级用户身份运行此function,并按照您的应用程序的要求运行。 一个选项是将其打包在每天或每小时执行的cron作业中。