PostgreSQL:赋予一个用户对PostgreSQL数据库的所有权限

我想给一个用户在数据库上的所有权限,而不使它成为管理员。 我想这样做的原因是,目前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;

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

我可以继续在MY_SCHEMA上给用户USAGE权限,但是它会抱怨没有对表的权限…

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

我在PostgreSQL 8.1.23工作。

509676 次浏览

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

您应该以超级用户和应用程序所需的常规用户身份运行此函数。一种选择是将其打包到每天或每小时执行的cron作业中。

所有命令都必须在连接到正确的数据库集群时执行。一定要确保。

角色是数据库集群的对象。同一集群中的所有数据库共享已定义的角色集。根据数据库/模式/表等授予/撤销特权。

显然,角色需要访问数据库。默认情况下,它被授予PUBLIC。其他:

GRANT CONNECT ON DATABASE my_db TO my_user;

Postgres 14或更高版本的基本权限

Postgres 14添加了预定义的非登录角色__ABC0 / pg_write_all_data .
它们对所有表、视图和序列具有SELECT / INSERTUPDATEDELETE特权。在模式上加上USAGE。我们可以在这些角色中GRANT成员:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

这涵盖了所有基本的DML命令(但不包括DDL,也不包括一些特殊的命令,如TRUNCATE或函数的EXECUTE特权!)。手册:

pg_read_all_data

读取所有数据(表、视图、序列),就像拥有SELECT权限一样 以及所有模式上的USAGE权限,即使没有 明确的。此角色没有role属性 BYPASSRLS集。如果正在使用RLS,管理员可能希望

.在该角色被GRANTed到的角色上设置BYPASSRLS

pg_write_all_data

写入所有数据(表,视图,序列),就像有INSERT, 对象上的UPDATEDELETE权限,以及对象上的USAGE权限 所有的模式,即使没有显式的。这个角色没有 设置角色属性BYPASSRLS。如果正在使用RLS,则使用 管理员可能希望在此角色上设置BYPASSRLS GRANTed。< / p >

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

命令必须在连接到正确的数据库时执行。一定要确保。

该角色(至少)需要模式上的USAGE特权。同样,如果它被授予PUBLIC,你就被覆盖了。其他:

GRANT USAGE ON SCHEMA public TO my_user;

或者在所有自定义模式上授予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
$$;

然后,所有的所有权限(需要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;

或者,你可以使用“格兰特Wizard"pgAdmin 4来处理GUI。

这涵盖了现有的对象的特权。要覆盖未来对象,设置DEFAULT PRIVILEGES。看到的:

还有一些其他对象,GRANT的手册有完整的列表。截至Postgres 14:

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

但剩下的就很少需要了。更多的细节:

考虑升级到当前版本

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

我在PostgreSQL 9.4.15数据库中添加了一个角色“eSumit”,并为该角色提供了所有权限:

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条目通过:

select * from pg_roles; enter image description here < / p > 数据库查询快照: enter image description here < / p >

GRANT USAGE ON SCHEMA schema_name

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

请注意:请记住,在将数据库的权限授予用户之前,您需要选择数据库。

资源: PostgreSQL格兰特

这是所有

我希望这对你们有帮助

GRANT ALL ON SCHEMA schema_name TO user_name;