非超级用户数据库管理

时间:2019-03-30 21:12:40

标签: postgresql

我正在使用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”创建了一个表,但是检查后,所有者不是Manager,而是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管理所有数据库。 那不是他的主人吗? 谢谢

1 个答案:

答案 0 :(得分:0)

数据库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;