【问题标题】:Non-SuperUser Database Management非超级用户数据库管理
【发布时间】:2019-03-30 21:12:40
【问题描述】:

我正在使用 PostgreSql 手册和其他指南来设置我的数据库环境。 到目前为止,情况看起来不错,但我想知道我是否有问题。

我正在尝试应用这个: 提示 最好创建一个具有 CREATEDB 和 CREATEROLE 权限但不是超级用户的角色,然后将此角色用于数据库和角色的所有日常管理。这种方法避免了以超级用户身份执行并不真正需要它的任务的危险。

我已经为此角色创建了一个用户。

createuser --interactive --pwprompt
Enter name of role to add: Manager
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

...并以新用户(经理)的身份连接到已经存在的数据库或者我是这么想的。

psql -d test
Password for user postgres:
psql (11.2)
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
Type "help" for help.

test=# \c test Manager
Password for user Manager
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
You are now connected to database "test" as user "Manager".
test=>

我为数据库“test”创建了一个表,但是在检查它时,所有者不是经理,而是 postgres。

test=> \dt
             List of relations
 Schema |     Name      | Type  |  Owner
--------+---------------+-------+----------
 public | Data-projects | table | postgres
(1 row)


test=> \dn
  List of schemas
  Name  |  Owner
--------+----------
 public | postgres
(1 row)

我不确定这是否好。我希望所有者是经理。 这是我第一次使用这些工具。有人可以指导我正确的方向吗? 我希望 Manager 管理所有数据库。 那不是让他成为主人吗? 谢谢

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    数据库test 不属于Manager,因为它是由用户postgres 创建的。创建对象的用户将是其所有者。

    但是,超级用户可以转让所有权:

    ALTER DATABASE test OWNED BY "Manager";
    

    我会给你一些额外的提示:

    • 在对象和用户的名称中只能使用小写字母、数字和_,否则您必须在 SQL 中为它们使用双引号,就像我在上面所做的那样。这会导致不必要的痛苦。

    • 运行以下命令使数据库更安全:

      REVOKE CREATE ON SCHEMA public FROM PUBLIC;
      
    • 创建一个新的架构来保存您的应用程序的对象:

      CREATE SCHEMA myapp;
      
    • 适当地设置search_path

      ALTER DATABASE test SET search_path = myapp, public;
      

    【讨论】:

    • 谢谢劳伦兹。因此,为清楚起见,Manager 正在管理数据库,即使不是所有者。所以我走在正确的轨道上......一切都很好 - 还是我需要让 Manager 成为所有者?
    • 你不需要,但如果你不需要,你应该授予manager数据库的CREATE权限,以便她可以在其中创建模式。
    • 谢谢。最后一件事。一旦我进入数据库,我的任何命令都无法工作。你知道为什么吗? test=# ALTER DATABASE test OWNED BY "Manager" test-# 如你所见,没有发生任何事情。无论发出什么命令,都会发生这种情况。
    • 非常感谢。我之前尝试过,但出现错误,所以我认为它适用于非 Windows 系统。有效。谢谢。
    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 2019-02-24
    • 2013-08-04
    • 2013-03-02
    • 2018-02-04
    • 2016-03-05
    • 2011-03-28
    • 2020-07-09
    相关资源
    最近更新 更多