我想给一个用户一个数据库的所有权限,而不使其成为管理员.

我试过:

grant ALL on database MY_DB to group MY_GROUP;

但它似乎没有给予任何许可.

Then 我试过:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

它似乎给了我创建对象的权限,但不允许在该模式上查询\删除属于其他用户的对象

我可以继续通过在我的_模式上给用户使用权限,但它会抱怨没有对表的权限...

所以我想我的问题是:有没有什么简单的方法可以让用户在数据库上拥有所有的权限?

我正在研究PostgreSQL 8.1.23.

推荐答案

All commands must be executed while connected to the right database cluster. Make sure of it.

角色是数据库cluster的对象.同一集群的所有数据库共享一组定义的角色.根据数据库/架构/表等授予/撤销权限.

显然,一个角色需要访问database.默认情况下是PUBLIC.其他:

GRANT CONNECT ON DATABASE my_db TO my_user;

博士后14岁及以上的基本特权

Postgres 14 adds the predefined, non-login roles pg_read_all_data / pg_write_all_data.
They have SELECT / INSERT, UPDATE, DELETE privileges for all tables, views, and sequences. Plus USAGE on schemas. We can GRANT membership in these roles:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

这涵盖了所有基本的DML命令(但不包括DDL,也不包括一些特殊命令,如TRUNCATEEXECUTE函数特权!).The manual:

pg_read_all_data

读取所有数据(表、视图、序列),就像拥有SELECT个权限一样

pg_write_all_data

写下所有数据(表、视图、序列),就好像有INSERT

不使用预定义角色的所有权限(任何Postgres版本)

Commands must be executed while connected to the right database. Make sure of it.

该角色需要(至少)schema上的USAGE特权.再说一次,如果这被授予PUBLIC,你就有保险了.其他:

GRANT USAGE ON SCHEMA public TO my_user;

或者在all个自定义模式上授予USAGE:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Then, all permissions for all tables (requires Postgres 9.0 or later).
And don't forget sequences (if any):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

或者,您可以使用"Grant Wizard" of pgAdmin 4来使用GUI.

这包括existing个对象的权限.要同时覆盖future 的对象,请设置DEFAULT PRIVILEGES.见:

还有一些其他对象,the manual for GRANT有完整的列表.从第14期开始:

数据库对象的权限(表、列、视图、外部表、序列、数据库、外部数据包装器、外部服务器、函数、过程、过程语言、模式或表空间)

但剩下的很少需要.更多详情:

考虑upgrading to a current version.

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

更新PostgreSQL 15中的JSON值

SQL Select 最小优先级

通过之前的连接-这是Oracle的错误吗?

冲突查询的UPDATE时违反非空约束

按两列分组,并根据SQL中的条件返回第三个列值

如何在T-SQL中编写row_number的WHERE子句?

删除对 JSON 数据的未解析引用的 SQL71502 警告

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

如何根据创建日期查找两个表中最接近的记录?

在 SQL Server 中查找重复项

如何查询自引用 comments 表以查找带有回复的 comments ,并按最新回复排序?

如何 for each id创建长度等于id长度的不同日期序列?

一次 Select 语句中按组累计的SQL累计数

Snowflake 中的对象是如何比较的?

SQL Server Where 条件

在 PostgreSQL 中,如何将数组中的每个元素用作另一个表中的键?

使用 SQL 表中的连接列删除重复记录

使用同一表中的数据或任何其他虚拟数据在 SQL 表中插入数据的最快方法