gpt4 book ai didi

postgresql - 允许 postgres 用户只列出他自己的数据库

转载 作者:行者123 更新时间:2023-11-29 11:24:51 25 4
gpt4 key购买 nike

我正在使用 postgresql 服务器,我想禁止我的用户查看同一服务器上的其他数据库。

本质上,\l 应该只列出他自己的数据库。

我很确定我需要从用户那里撤销一项权利,但我在文档中找不到它。

最佳答案

这似乎可行,但可能会产生无法预料的后果。它需要修改系统目录,这不是一个好主意!

首先,您必须允许 super 用户通过将此添加到您的 postgresql 配置来更新系统目录:

allow_system_table_mods = on

并重新启动。

现在,您可以使用 DDL 语句来修改系统目录(您应该害怕)。连接到其中一个用户数据库(测试一个是个好主意)并且:

alter table pg_catalog.pg_database rename to pg_database_catalog;
create view pg_catalog.pg_database as
select oid, 1262::oid as tableoid, pg_database_catalog.*
from pg_catalog.pg_database_catalog
where has_database_privilege(pg_database_catalog.oid, 'connect');
grant select on pg_catalog.pg_database to public;

您现在应该会发现,如果您以低权限用户身份连接到那个 数据库,\l 命令将只列出该用户可以连接到的数据库.

问题是您现在需要猜测用户最初连接到哪个数据库以从中获取他们的数据库列表。如果他们最初连接到自己的数据库,那么此时您可能已经完成了。如果他们首先连接到 postgrestemplate1,那么您需要改为在该数据库上进行此更改。

在我看来这应该可行,因为 pg_database 目录由 postgres 后端直接通过 oid 引用,而不是通过名称引用,因此将它移开并更改哪些行是其中显示的内容对他们来说应该是不可见的。特别是,您不能阻止服务器向用户区分数据库不存在和他们没有连接权限。

我不打算做出任何 promise ,即这种变化不会导致其他问题发生。如果它坏了,您可以保留碎片。

您可能希望在模板数据库中进行此更改,并在将来从中创建用户数据库,并在完成后停用 allow_system_table_mods 设置(记住,这需要重新启动服务器) .

此外,我在 9.0 上对此进行了测试:在我看来它也应该适用于一些早期版本,买者自负。

关于postgresql - 允许 postgres 用户只列出他自己的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4917484/

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