【发布时间】:2015-03-31 10:42:48
【问题描述】:
我刚刚设置了 Postgres 以供我网络上的不同用户使用。每个用户都有自己的用户名/密码/数据库,但是当我连接到 Pg 时,我还可以看到一个“postgres”数据库(甚至创建表等)。我试图从公共撤销对该数据库的访问,但它不会让我连接。 postgres 数据库到底是什么,为什么需要它?我可以禁用它,让用户只能看到我为他们创建的数据库吗?
【问题讨论】:
标签: postgresql
我刚刚设置了 Postgres 以供我网络上的不同用户使用。每个用户都有自己的用户名/密码/数据库,但是当我连接到 Pg 时,我还可以看到一个“postgres”数据库(甚至创建表等)。我试图从公共撤销对该数据库的访问,但它不会让我连接。 postgres 数据库到底是什么,为什么需要它?我可以禁用它,让用户只能看到我为他们创建的数据库吗?
【问题讨论】:
标签: postgresql
运行initdb 时默认创建postgres 数据库。
创建数据库集群包括创建数据库数据所在的目录(...)创建 template1 和 postgres 数据库。稍后创建新数据库时,会复制 template1 数据库中的所有内容。 (...) postgres 数据库是供用户、实用程序和第三方应用程序使用的默认数据库。
没有什么特别的,如果你不需要它,你可以放下它:
drop database postgres;
当然,您需要以超级用户身份执行此操作。唯一的缺点是,当您以 postgres 操作系统用户身份运行 psql 时,您需要显式提供要连接的数据库名称
【讨论】:
如果您删除 postgres 数据库,您会发现一些令人困惑的事情。一方面,大多数工具默认将其用作要连接的默认数据库。此外,在postgres 用户下运行的任何内容默认都将连接到postgres 数据库。
而不是丢弃它,REVOKE 默认连接到它。
REVOKE connect ON DATABASE postgres FROM public;
超级用户(通常是postgres)以及您明确授予访问数据库权限的任何用户仍然可以将其用作方便的数据库来连接。但其他人不能。
要授予用户连接权限,只需:
GRANT connect ON DATABASE postgres TO myuser;
【讨论】:
psql 验证这一点。也许他们正在使用假设该数据库存在的工具?如果他们使用 pgadmin,他们必须覆盖默认的系统数据库。
postgres db 可访问,您可以撤销在模式上创建公共。我强烈建议您阅读 PostgreSQL 的多租户托管方案。