在PostgreSQL中,所有的东西都是围绕着角色的概念建立的。
当第一次在macOS上安装PostgreSQL时,脚本用你的macOS用户名创建了一个角色,并给出了一系列的权限。
在PostgreSQL中没有用户,只有角色。
通过在终端运行psql postgres ,你会自动用你的macOS用户名登录到PostgreSQL,因此可以访问创建的角色。
在我的例子中,flaviocopes 角色被创建,我可以通过使用\du 命令看到它。

看到了吗?我有以下默认的角色属性。
SuperuserCreate roleCreate DBReplicationBypass RLS
并且我不是任何其他角色的成员(后面会有更多的介绍)
创建一个新的角色
使用CREATE ROLE 命令可以创建一个新的角色。
比如说。

我们得到了一个新的角色,其角色属性为Cannot login 。我们新创建的用户将无法登录。
你可以试着输入\q 命令,然后再输入psql postgres -U testing ,但你会看到这个错误。

为了解决这个问题,我们必须在创建时添加LOGIN 角色属性。
CREATE ROLE <role> WITH LOGIN;
如果我们使用删除该角色。
并在这次添加WITH LOGIN 。
DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;
我们可以看到,testing 角色可以登录,因为这次我们没有Cannot login 角色属性。

通过添加命令\q 来尝试退出,然后再添加psql postgres -U testing 。

注意到提示从=# 变成了=> ,因为我们现在没有了Superuser 角色属性。
为一个角色添加密码
在前面的CREATE ROLE 命令中,我们创建了一个没有密码的角色。当然,拥有(安全)密码是非常重要的。你可以通过使用PASSWORD 关键字来添加一个密码。
CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';
CREATE USER
另一种定义角色并自动添加LOGIN 属性(有效地创建可以登录的用户)的方法是使用CREATE USER 。
CREATE USER <role> PASSWORD '<password>';
为一个角色添加一个角色属性
一个角色属性可以在以后使用ALTER ROLE 命令添加到一个角色中。
让我们假设我们创建了一个没有LOGIN属性的角色。
CREATE ROLE <username> PASSWORD '<password>';
我们可以使用添加它。
ALTER ROLE <role> WITH LOGIN;
内置的角色属性
我们已经看到了LOGIN 角色属性,以允许一个角色登录。
但是我们还可以使用哪些内置的角色属性呢?
LOGIN/ : 允许(或不允许)登录到PostgreSQLNOLOGINSUPERUSER/ : 允许(或不允许)超级用户的权限。一个数据库超级用户将绕过其他权限检查,除了 (必须单独授予)。NOSUPERUSERLOGINCREATEDB/ : 允许(或不允许)创建新数据库的能力。NOCREATEDBCREATEROLE/ : 允许(或不允许)创建新角色的能力NOCREATEROLECREATEUSER/ :允许(或不允许)创建新用户的能力NOCREATEUSERINHERIT/ :允许(或不允许)使权限可以继承的能力NOINHERITREPLICATION/ : 授予(或不授予)复制权限(一个高级话题,我们不涉及)。NOREPLICATION
组角色
在PostgreSQL中,不存在用户组。
相反,你可以创建具有某些权限的角色,然后将这些角色授予其他角色。
如果这些角色有 INHERIT 属性,角色将继承授予它们的角色的权限。
创建一个群组角色
要创建一个群组角色,键入
语法与创建一个角色相同。
一旦群组角色被创建,你可以使用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;
组角色属性
默认情况下,向组角色添加一个角色不会使该角色继承组角色的属性(权限)。
你需要创建带有INHERIT 属性的组角色。
假设你创建了雇员组角色,并给它分配了CREATEDB 属性。
CREATE ROLE employee WITH CREATEDB INHERIT;
现在使用INHERIT 创建一个新角色。
CREATE ROLE flavio;
GRANT employee TO flavio;
