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

u3r8eeie  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(8)|浏览(615)

我想授予用户对数据库的所有权限,但不使其成为管理员。我想这样做的原因是,目前DEV和PROD是同一集群上的不同数据库,因此我不希望用户能够更改生产对象,但必须能够更改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.

c90pui9n

c90pui9n1#

  • 必须在连接到正确的数据库群集时执行所有命令。请确保这一点。*

角色是数据库 * 集群 * 的对象。同一集群的所有数据库共享一组已定义的角色。权限是按数据库/方案/表等授予/撤消的。
很明显,一个角色需要访问 * 数据库 *,默认情况下,这是PUBLIC的权限。

GRANT CONNECT ON DATABASE my_db TO my_user;

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

Postgres 14添加了预定义的非登录角色pg_read_all_data / 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,也不包括一些特殊命令,如TRUNCATEEXECUTE函数特权!)。The manual:
x1米11米1x
读取所有数据(表、视图、序列),就像对这些对象具有SELECT权限,对所有方案具有USAGE权限一样,即使没有显式地具有该权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望对该角色所具有的GRANT属性设置BYPASSRLS
pg_write_all_data
写入所有数据(表、视图、序列),就像对这些对象具有INSERTUPDATEDELETE权限,对所有方案具有USAGE权限一样,即使没有显式地具有该权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望在角色上设置X1 M23 N1 X,该角色被X1 M24 N1 X艾德给该角色。

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

  • 必须在连接到正确的数据库时执行命令。请确保这一点。*

该角色需要(至少)对 schemaUSAGE权限。同样,如果该权限被授予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
$$;

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

或者,您可以使用"Grant Wizard" of pgAdmin 4来处理GUI。
这包括现有对象的权限。要同时包括将来的对象,请设置DEFAULT PRIVILEGES。请参阅:

还有一些其他的对象,the manual for GRANT有完整的列表。
对数据库对象(表、列、视图、外表、序列、数据库、外部数据 Package 、外部服务器、函数、过程、过程语言、方案或表空间)的权限
但其余部分很少需要。更多详细信息:

  • 授予PostgreSQL中特定数据库的权限
  • 如何将视图上的所有权限授予任意用户

upgrading to a current version为例。

pinkon5k

pinkon5k2#

GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
vm0i2vca

vm0i2vca3#

在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作业,每天或每小时执行一次。

2w3kk1z5

2w3kk1z54#

我执行了以下操作,在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条目:
从pg_roles中选择 *;

数据库查询快照:

mm5n2pyu

mm5n2pyu5#

在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;
    • 注意**:请记住,您需要先选择数据库,然后才能将其权限授予用户。

就这样
"我希望这能帮上忙"

pinkon5k

pinkon5k6#

将SCHEMA schema_name上的用法授予用户;

vojdkbi0

vojdkbi07#

GRANT ALL ON SCHEMA schema_name TO user_name;
vkc1a9a2

vkc1a9a28#

    • 授予用户对PostgreSQL数据库的所有权限:**
    • 命令:**
grant all privileges on database [database_name] to [database_user_name];
    • 示例:**
grant all privileges on database studentdb to shaifullah;
    • 或**
GRANT ALL PRIVILEGES ON DATABASE studentdb TO shaifullah;

相关问题