【问题标题】:Database named "postgres"名为“postgres”的数据库
【发布时间】:2015-03-31 10:42:48
【问题描述】:

我刚刚设置了 Postgres 以供我网络上的不同用户使用。每个用户都有自己的用户名/密码/数据库,但是当我连接到 Pg 时,我还可以看到一个“postgres”数据库(甚至创建表等)。我试图从公共撤销对该数据库的访问,但它不会让我连接。 postgres 数据库到底是什么,为什么需要它?我可以禁用它,让用户只能看到我为他们创建的数据库吗?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    运行initdb 时默认创建postgres 数据库。

    Quote from the manual:

    创建数据库集群包括创建数据库数据所在的目录(...)创建 template1 和 postgres 数据库。稍后创建新数据库时,会复制 template1 数据库中的所有内容。 (...) postgres 数据库是供用户、实用程序和第三方应用程序使用的默认数据库。

    没有什么特别的,如果你不需要它,你可以放下它:

    drop database postgres;
    

    当然,您需要以超级用户身份执行此操作。唯一的缺点是,当您以 postgres 操作系统用户身份运行 psql 时,您需要显式提供要连接的数据库名称

    【讨论】:

      【解决方案2】:

      如果您删除 postgres 数据库,您会发现一些令人困惑的事情。一方面,大多数工具默认将其用作要连接的默认数据库。此外,在postgres 用户下运行的任何内容默认都将连接到postgres 数据库。

      而不是丢弃它,REVOKE 默认连接到它。

      REVOKE connect ON DATABASE postgres FROM public;
      

      超级用户(通常是postgres)以及您明确授予访问数据库权限的任何用户仍然可以将其用作方便的数据库来连接。但其他人不能。

      要授予用户连接权限,只需:

      GRANT connect ON DATABASE postgres TO myuser;
      

      【讨论】:

      • 撤销“postgres”数据库上的连接会阻止我的用户连接到他们的“常规”数据库,例如他们得到“连接到服务器时出错:致命:数据库“postgres”的权限被拒绝详细信息:用户没有 CONNECT 权限。”授予用户这些权限允许他们查看和编辑数据库,考虑到这是一个“系统”数据库并且只有超级用户应该有权访问它(至少在编写/修改方面),这有点奇怪。
      • 此外,这是一个可公开访问和可写的数据库,这意味着用户可以向数据库“发送垃圾邮件”(最大尺寸)和/或覆盖其他用户编写的内容。这真的没什么大不了的,但很烦人,我想知道处理这个特殊数据库的最佳实践是什么。
      • @user3609832 重新阻止连接到其他数据库...不,不应该。您可以使用psql 验证这一点。也许他们正在使用假设该数据库存在的工具?如果他们使用 pgadmin,他们必须覆盖默认的系统数据库。
      • @user3609832 “最佳做法”是按照说明撤销对它的访问权限。或者,如果您坚持让postgres db 可访问,您可以撤销在模式上创建公共。我强烈建议您阅读 PostgreSQL 的多租户托管方案。
      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多