授予数据库角色
您可以使用 授权(角色) 将一个或多个角色分配给用户或其他角色:
GRANT role[,...] TO grantee[,...] [ WITH ADMIN OPTION ]
例如,您可以创建三个角色(appdata
、applogs
和 appadmin
)并为用户 bob
授予 appadmin
:
=> CREATE ROLE appdata;
CREATE ROLE
=> CREATE ROLE applogs;
CREATE ROLE
=> CREATE ROLE appadmin;
CREATE ROLE
=> GRANT appadmin TO bob;
GRANT ROLE
将角色授予另一个角色
GRANT
可以将一个或多个角色分配给另一个角色。例如,以下 GRANT
语句将角色 appdata
和 applogs
授予角色 appadmin
:
=> GRANT appdata, applogs TO appadmin;
-- grant to other roles
GRANT ROLE
因为先前为用户 bob 分配了角色 appadmin
,所以他现在拥有向角色 appdata
和 applogs
授予的所有权限。
当您将一个角色授予另一个角色时,Vertica 会检查循环引用。在上一个示例中,已将角色 appdata
分配给 appadmin
角色。因此,随后将 appadmin
分配给 appdata
的尝试将失败,并返回以下警告:
=> GRANT appadmin TO appdata;
WARNING: Circular assignation of roles is not allowed
HINT: Cannot grant appadmin to appdata
GRANT ROLE
启用角色
向用户授予角色后,必须启用该角色。您可以为当前会话启用角色:
=> SET ROLE appdata;
SET ROLE
还可以通过使用
ALTER USER...DEFAULT ROLE
修改用户的配置文件,在用户登录期间启用角色:
=> ALTER USER bob DEFAULT ROLE appdata;
ALTER USER
授予管理权限
您可以通过使用 WITH ADMIN OPTION
选项限定 授权(角色) 语句,从而将对角色的管理访问权限委托给非超级用户。具有管理访问权限的用户可以管理其他用户对该角色的访问权限,包括向他们授予管理访问权限。在以下示例中,超级用户将具有管理权限的 appadmin
角色授予用户 bob
和 alice.
=> GRANT appadmin TO bob, alice WITH ADMIN OPTION;
GRANT ROLE
现在,两个用户都可以行使他们的管理权限来将 appadmin
角色授予其他用户或撤销该角色。例如,用户 bob
现在可以撤销用户 alice
的 appadmin
角色:
=> \connect - bob
You are now connected as user "bob".
=> REVOKE appadmin FROM alice;
REVOKE ROLE
当心
与所有用户权限模型一样,当向任何用户授予具有管理权限的角色时,数据库超级用户应当慎重。例如,如果数据库超级用户向两位用户授予具有管理权限的角色,其中任一用户都可以撤销另一个用户的该角色。示例
以下示例创建名为 commenter
的角色并将该角色授予用户 bob
:
-
创建
comments
表:=> CREATE TABLE comments (id INT, comment VARCHAR);
-
创建
commenter
角色:=> CREATE ROLE commenter;
-
授予
commenter
对comments
表的 INSERT 和 SELECT 权限:=> GRANT INSERT, SELECT ON comments TO commenter;
-
向用户
bob
授予commenter
角色。=> GRANT commenter TO bob;
-
为了访问该角色及其关联权限,
bob
为自己启用新授予的角色。=> \c - bob => SET ROLE commenter;
-
因为
bob
对comments
表具有 INSERT 和 SELECT 权限,所以他可以执行以下操作:=> INSERT INTO comments VALUES (1, 'Hello World'); OUTPUT -------- 1 (1 row) => SELECT * FROM comments; id | comment ----+------------- 1 | Hello World (1 row) => COMMIT; COMMIT
-
因为
bob
的角色缺少 DELETE 权限,所以以下语句会返回错误:=> DELETE FROM comments WHERE id=1; ERROR 4367: Permission denied for relation comments