在PostgreSQL中,所有内容都是围绕role概念构建的。

在macOS上首次安装PostgreSQL时,该脚本使用您的macOS用户名创建了一个角色 ,并授予了权限列表。

PostgreSQL中没有用户,只有role 。

通过在终端中运行psql postgres ,您将使用您的macOS用户名自动登录到PostgreSQL,从而访问创建的角色。

就我而言,创建了flaviocopes角色,可以使用\du命令看到它:

postgre用户设置为dba postcrossing用户名_postgre用户设置为dba

看到? 默认情况下,我具有以下角色属性 :

  • Superuser
  • Create role
  • Create DB
  • Replication
  • Bypass RLS

而且我不是任何其他角色的成员(稍后再讨论)

创建一个新角色 (Creating a new role)

使用CREATE ROLE命令创建一个新角色:

CREATE ROLE <role>;

例如:

CREATE ROLE testing;

postgre用户设置为dba postcrossing用户名_postgre用户设置为dba_02

我们有了一个Cannot login角色属性的新角色。 我们新创建的用户将无法登录。

您可以先输入\q命令,然后再输入psql postgres -U testing尝试,但是您会看到此错误:

postgre用户设置为dba postcrossing用户名_角色权限_03

要解决此问题,我们必须在创建时添加LOGIN角色属性:

CREATE ROLE <role> WITH LOGIN;

如果我们使用以下方法删除该角色:

DROP ROLE <role>;

并这次添加WITH LOGIN :

DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;

我们可以看到testing角色可以登录,因为这次我们没有Cannot login role属性:

postgre用户设置为dba postcrossing用户名_postgre用户设置为dba_04

尝试添加命令\q退出,然后添加psql postgres -U testing :

postgre用户设置为dba postcrossing用户名_PostgreSQL_05

请注意, 提示已从=#更改为=>因为我们现在没有Superuser角色属性。

为角色添加密码 (Adding a password to a role)

在上一个CREATE ROLE命令中,我们创建了一个没有密码的角色。 当然,拥有(安全)密码非常重要。 您可以使用PASSWORD关键字添加密码:

CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';

创建用户 (CREATE USER)

使用自动添加的LOGIN属性来定义角色的另一种方法(有效地创建可以登录的用户)是使用CREATE USER :

CREATE USER <role> PASSWORD '<password>';

向角色添加角色属性 (Adding a role attribute to a role)

稍后可以使用ALTER ROLE命令将角色属性添加到角色。

假设我们创建了一个没有LOGIN属性的角色:

CREATE ROLE <username> PASSWORD '<password>';

我们可以使用以下方法添加它:

ALTER ROLE <role> WITH LOGIN;

内置角色属性 (Built-in role attributes)

我们已经看到LOGIN角色属性,以允许角色登录。

但是,我们还可以使用其他哪些内置角色属性?

  • LOGIN / NOLOGIN:允许(或不允许)登录到PostgreSQL
  • SUPERUSER / NOSUPERUSER:允许(或不允许)超级用户权限。 数据库超级用户将绕过除LOGIN (必须单独授予)以外的其他权限检查。
  • CREATEDB / NOCREATEDB:允许(或不允许)创建新数据库的能力
  • CREATEROLE / NOCREATEROLE:允许(或不允许)创建新角色
  • CREATEUSER / NOCREATEUSER:允许(或不允许)创建新用户
  • INHERIT / NOINHERIT:允许(或不允许)使特权可继承
  • REPLICATION / NOREPLICATION:授予(或不授予)复制权限(我们将不介绍的高级主题)

组角色 (Group roles)

在PostgreSQL中,没有用户组。

相反,您可以创建具有特定权限的角色,然后将这些角色授予其他角色。

如果角色具有INHERIT属性,则角色将继承授予他们的角色的权限。

建立群组角色 (Create a group role)

要创建组角色,请键入

CREATE ROLE <groupname>;

语法与创建角色相同。

创建组角色后,您可以使用GRANT将角色添加到组角色中:

GRANT <groupname> TO <role>

例如,我们可以创建一个flavio用户角色,一个“雇员”组角色,并将该用户分配给该组角色:

CREATE USER flavio PASSWORD 'superSecret123$';
CREATE ROLE employee;
GRANT employee TO flavio;

您可以使用以下方法从组角色中删除角色:

REVOKE <groupname> FROM <username>

例:

REVOKE employee FROM flavio;

组角色属性 (Group role attributes)

默认情况下,将角色添加到组角色不会使该角色继承组角色的属性(权限)。

您需要使用INHERIT属性创建组角色。

假设您创建了雇员组角色,并为其分配了CREATEDB属性:

CREATE ROLE employee WITH CREATEDB INHERIT;

现在使用INHERIT创建一个新角色:

CREATE ROLE flavio;
GRANT employee TO flavio;

postgre用户设置为dba postcrossing用户名_用户权限_06