postgresql - 如何将管理员用户添加到现有的 postgres 数据库?
问题描述
我们有一个现有的 postgres 数据库gsrdb
在生产中使用superuser gsr
。我们一直在与该用户进行所有数据库维护gsr
。gsr
此外,我们的应用服务使用同一用户在数据库上执行事务。
我们现在想改变这一点。我们需要一个单独的超级用户gsr_admin
(其凭据由 Vault 管理),它可以进行 dba 维护,但仍然让我们的应用服务使用现有用户gsr
。
我面临的问题是,到目前为止,所有数据库对象都归gsr
用户所有,如果我以用户身份gsr_admin
在数据库上运行更新,无论是表约束还是序列,它都会失败说error: must be owner of relation...blah blah
我怎样才能解决这个问题?
所以我在想我是否可以创建一个名为的超级用户管理组角色admin_group
并将所有数据库对象的所有所有权从用户重新分配给它gsr
,然后更改两个用户gsr
并gsr_admin
属于这个管理组角色。这样一来,到目前为止创建的所有内容都将归角色所有admin_group
吗?我是否以用户gsr
身份创建新对象,gsr_admin
或者他们中的任何一个仍然可以更新对象?
我可能错了。真的很感激一些投入。
解决方案
只需运行
ALTER ROLE gsr NOSUPERUSER;
ALTER ROLE gsr RENAME TO gsr_admin; -- needs a new password now
CREATE ROLE gsr LOGIN;
GRANT USAGE ON SCHEMA myschema TO gsr;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA myschema TO gsr;
同样,授予USAGE
序列和其他所需权限。您可能还想ALTER DEFAULT PRIVILEGES
为将来的对象运行一些。
推荐阅读
- html - 很难在滚动时创建固定标题。典型的解决方案不再适合我
- rest - Springboot 2:有什么方法可以将 TestRestTemplate 配置为仅使用 HTTP/2 协议?
- django - Django:bulk_destroy 返回“400:错误请求”
- python - 如何使用 vsc 在 python 的同一行中接受多个整数?
- c - “char *accum(const char *source);”是什么意思?在 C 中是什么意思?
- android - 在缺口设备模拟器上测试应用程序
- cmd - Dir 命令:如何仅显示创建文件的日期和从中创建的文件 .txt
- python - 在 aiohttp 请求中发送用户凭据
- azure - 了解 Microsoft Azure AD 代表 (OBO) 流
- java - 如何在使用 java 的字符串中只允许 !@#$%^&*