gpt4 book ai didi

sql - 授予 PostgreSQL 中特定数据库的权限

转载 作者:太空狗 更新时间:2023-10-30 01:39:54 27 4
gpt4 key购买 nike

我正从 MySQL 迁移到 PostgreSQL,但在用户权限方面遇到了瓶颈。我习惯于使用以下命令为用户分配对数据库所有表的所有权限:

# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';

在我看来,PostgreSQL 9.x 解决方案涉及将权限分配给“架构”,但事实证明,我需要付出很多努力才能弄清楚要发布的 SQL 到底是什么。我知道再花几个小时的研究就会得出答案,但我认为从 MySQL 迁移到 PostgreSQL 的每个人都可以从网上至少有一页提供简单而完整的方法中受益。这是我需要为用户发出的唯一命令。我宁愿不必为每个新表发出命令。

我不知道在 PostgreSQL 中必须以不同方式处理哪些场景,因此我将列出一些我过去通常必须处理的场景。假设我们只想修改已创建的单个数据库的权限。

(1a) Not all of the tables have been created yet, or (1b) the tables have already been created.

(2a) The user has not yet been created, or (2b) the user has already been created.

(3a) Privileges have not yet been assigned to the user, or (3b) privileges were previously assigned to the user.

(4a) The user only needs to insert, update, select, and delete rows, or (4b) the user also needs to be able to create and delete tables.

我已经看到将所有权限授予所有数据库的答案,但这不是我想要的。拜托,我正在寻找一个简单的食谱,虽然我也不介意解释。

我不想向所有用户和所有数据库授予权限,这似乎是传统的捷径,因为当任何一个用户受到威胁时,这种方法就会危及所有数据库。我托管多个数据库客户端并为每个客户端分配不同的登录名。

看起来我还需要 USAGE 权限来获取 serial 列的递增值,但我必须按某种顺序授予它。我的问题变得更加复杂。

最佳答案

Postgres 中的基本概念

角色是全局对象,可以访问数据库集群中的所有数据库 - 给定所需的权限。

一个集群拥有许多数据库,这些数据库拥有许多模式。不同数据库中的模式(即使具有相同的名称)是不相关的。授予架构权限仅适用于当前数据库(授予时的当前数据库)中的此特定架构。

默认情况下,每个数据库都以 public 模式开始。这是一个约定,许多设置都是从​​它开始的。除此之外,public 模式与其他模式一样。

来自 MySQL,您可能希望从单个模式 public 开始,有效地完全忽略模式层。我经常为每个数据库使用几十个模式。
模式有点(但不完全)像文件系统中的目录。

一旦你使用了多个模式,一定要理解 search_path 设置:

默认权限

Per documentation on GRANT:

PostgreSQL grants default privileges on some types of objects toPUBLIC. No privileges are granted to PUBLIC by default on tables,columns, schemas or tablespaces. For other types, the defaultprivileges granted to PUBLIC are as follows: CONNECT and CREATE TEMP TABLEfor databases; EXECUTE privilege for functions; and USAGE privilege for languages.

所有这些默认值都可以使用 ALTER DEFAULT PRIVILEGES 更改:

组角色

Like @Craig commented , 最好将GRANT 特权授予组角色,然后使特定用户成为该角色的成员(GRANT 将组角色授予用户角色)。这样可以更简单地处理和撤销某些任务所需的特权包。

组角色只是另一个没有登录的角色。添加登录以将其转换为用户角色。更多:

预定义角色

更新:Postgres 14 或更高版本添加了新的 predefined roles (正式的“默认角色”)pg_read_all_datapg_write_all_data 来简化下面的一些内容。见:

食谱

比如说,我们有一个新的数据库 mydb,一个组 mygrp 和一个用户 myusr ...

当以 super 用户身份连接到相关数据库时(例如 postgres):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

要像您写的那样分配“一个用户对所有表的所有权限”(我可能会更严格):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

要为 future 的对象设置默认权限,请为在此模式中创建对象的每个角色运行:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

现在,将组授予用户:

GRANT mygrp TO myusr;

相关回答:

替代(非标准)设置

来自 MySQL,并且由于您希望保持数据库权限分离,您可能会喜欢这种非标准设置 db_user_namespacePer documentation:

This parameter enables per-database user names. It is off by default.

仔细阅读手册。我不使用此设置。它不会使上述内容无效。

关于sql - 授予 PostgreSQL 中特定数据库的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com