角色是可以向一个或多个用户或其他角色授予的权限集。角色可帮助您授予和管理不同类别用户的权限集,而不是将这些权限单独授予每个用户。
例如,多个用户可能需要管理权限。您可以按如下方式向他们授予这些权限:
-
使用 CREATE ROLE创建管理员角色:
CREATE ROLE administrator;
-
使用一个或多个 GRANT 语句向此角色授予适当的权限。您可以在以后根据需要添加和移除权限。角色权限的更改会自动传播给拥有该角色的用户。
角色是可以向一个或多个用户或其他角色授予的权限集。角色可帮助您授予和管理不同类别用户的权限集,而不是将这些权限单独授予每个用户。
例如,多个用户可能需要管理权限。您可以按如下方式向他们授予这些权限:
使用 CREATE ROLE创建管理员角色:
CREATE ROLE administrator;
使用一个或多个 GRANT 语句向此角色授予适当的权限。您可以在以后根据需要添加和移除权限。角色权限的更改会自动传播给拥有该角色的用户。
Vertica 具有以下预定义角色:
安装时,Vertica 会自动按如下方式授予和启用预定义角色:
将 DBADMIN、PSEUDOSUPERUSER 和 DBDUSER 角色不可撤销地授予 dbadmin 用户。这些角色始终会针对 dbadmin
启用,并且永远无法删除。
在创建时将 PUBLIC 授予 dbadmin
以及所有其他用户。此角色始终处于启用状态,并且无法删除或撤销。
安装后,dbadmin
用户和具有 PSEUDOSUPERUSER 角色的用户可以将一个或多个预定义角色授予任何用户或非预定义角色。例如,以下一组语句创建 userdba
角色并向它授予预定义角色 DBADMIN:
=> CREATE ROLE userdba;
CREATE ROLE
=> GRANT DBADMIN TO userdba WITH ADMIN OPTION;
GRANT ROLE
如果原始 授权(角色) 语句包含 WITH ADMIN OPTION,则被授予预定义角色的用户和角色可以将该角色授予其他用户。有一个例外:如果您向某个用户授予 PSEUDOSUPERUSER 角色并省略 WITH ADMIN OPTION,则被授予者可以将任何角色(包括所有预定义角色)授予其他用户。
例如,userdba
角色以前被授予 DBADMIN 角色。因为 GRANT 语句包含 WITH ADMIN OPTION,所以被分配 userdba
角色的用户可以将 DBADMIN 角色授予其他用户:
=> GRANT userdba TO fred;
GRANT ROLE
=> \c - fred
You are now connected as user "fred".
=> SET ROLE userdba;
SET
=> GRANT dbadmin TO alice;
GRANT ROLE
您可以向除 SYSMONITOR 以外的预定义角色授予对单个数据库对象(例如表或架构)的权限。例如:
=> CREATE SCHEMA s1;
CREATE SCHEMA
=> GRANT ALL ON SCHEMA s1 to PUBLIC;
GRANT PRIVILEGE
您可以向 PUBLIC 授予任何角色,包括预定义角色。例如:
=> CREATE ROLE r1;
CREATE ROLE
=> GRANT r1 TO PUBLIC;
GRANT ROLE
对于任何其他预定义角色,不能通过向其授予其他角色来修改它。尝试这样做会导致回退错误:
=> CREATE ROLE r2;
CREATE ROLE
=> GRANT r2 TO PSEUDOSUPERUSER;
ROLLBACK 2347: Cannot alter predefined role "pseudosuperuser"
DBADMIN
角色是在安装数据库时分配给 dbadmin
用户的预定义角色。安装后,dbadmin
用户和具有
PSEUDOSUPERUSER
角色的用户可以将任何角色授予任何用户或非预定义角色。
例如,超级用户 dbadmin
创建角色 fred
并向 fred
授予 DBADMIN
角色:
=> CREATE USER fred;
CREATE USER
=> GRANT DBADMIN TO fred WITH ADMIN OPTION;
GRANT ROLE
在用户 fred
启用其 DBADMIN role
后,他可以通过创建用户 alice
来行使他的 DBADMIN
权限。因为 GRANT
语句包含 WITH ADMIN OPTION
,所以 fred 也可以将 DBADMIN
角色授予用户 alice
:
=> \c - fred
You are now connected as user "fred".
=> SET ROLE dbadmin;
SET
CREATE USER alice;
CREATE USER
=> GRANT DBADMIN TO alice;
GRANT ROLE
下表列出了 DBADMIN 角色支持的权限:
创建用户和角色,并向他们授予角色和权限
创建和删除架构
查看所有系统表
查看和终止用户会话
访问任意用户创建的所有数据
PSEUDOSUPERUSER
角色是在安装数据库时自动分配给 dbadmin
用户的预定义角色。dbadmin
可以将此角色授予任何用户角色或非预定义角色。此后,PSEUDOSUPERUSER
用户可以将任何角色(包括预定义角色)授予其他用户。
具有 PSEUDOSUPERUSER
角色的用户有权履行管理权限(无法撤销)。角色权限包括:
绕过所有 GRANT/REVOKE 身份验证
创建架构和表
创建用户和角色,并向他们授予权限
修改用户帐户,例如,设置用户帐户的密码、锁定/解锁帐户。
创建或删除 UDF 库和函数,或任何外部过程
DBDUSER
角色是在安装数据库时分配给 dbadmin
用户的预定义角色。dbadmin
和任何 PSEUDOSUPERUSER
可以将此角色授予任何用户或非预定义角色。拥有此角色并启用它的用户可以从命令行调用 Database Designer 函数。
确保将资源池与 DBDUSER
角色相关联,以方便在运行 Database Designer 时进行资源管理。多个用户可以同时运行 Database Designer,他们互相之间不会出现干扰,也不会用尽群集的所有资源。当您以编程方式或使用管理工具运行 Database Designer 时,设计执行操作通常会限制在该用户的资源池内,但不太密集的任务可能会溢出到系统资源池。
除了作为 DBADMIN 用户维护 Vertica 以外,组织的数据库管理员可能还有许多责任。在本例中,DBADMIN 可能希望将一些 Vertica 管理任务委托给其他 Vertica 用户。
DBADMIN 可以将任务委托给 SYSMONITOR 角色,为其授予对系统表的访问权限,而不必授予完整的 DBADMIN 访问权限。
SYSMONITOR 角色提供以下权限。
查看所有标记为可监控的系统表。通过发出以下语句,您可以查看所有可监控表的列表:
=> select * from system_tables where is_monitorable='t';
如果在将 SYSMONITOR 授予用户或角色时包含 WITH ADMIN OPTION
,则该用户或角色可以将 SYSMONITOR 权限授予其他用户和角色。
若要为用户或角色授予 SYSMONITOR 角色,您必须是以下身份之一:
DBADMIN 用户
已分配有 SYSMONITOR 且具有 ADMIN OPTION 的用户
使用 GRANT(角色) SQL 语句为用户分配 SYSMONITOR 角色。以下示例将展示如何为 user1 授予 SYSMONITOR 角色,并通过使用 WITH ADMIN OPTION 参数包含管理权限。ADMIN OPTION 将为 SYSMONITOR 角色授予管理权限。
=> GRANT SYSMONITOR TO user1 WITH ADMIN OPTION
;
以下示例将展示如何为 user1 撤销 SYSMONITOR 角色的 ADMIN OPTION 权限。
=> REVOKE ADMIN OPTION for SYSMONITOR FROM user1
;
使用 CASCADE 为所有分配有 SYSMONITOR 角色的用户撤销 ADMIN OPTION 权限。
=> REVOKE ADMIN OPTION for SYSMONITOR FROM PUBLIC CASCADE
;
以下示例将展示如何:
创建用户
创建角色
为新角色授予 SYSMONITOR 权限
为用户授予角色
=> CREATE USER user1; => CREATE ROLE monitor; => GRANT SYSMONITOR to monitor; => GRANT monitor to user1;
以下示例将使用“授予 SYSMONITOR 角色”示例中创建的用户和角色来说明如何:
创建名为 personal_data 的表
以 user1 身份登录
为 user1 授予 monitor 角色。(您已在“授予 SYSMONITOR 角色”示例中为 monitor 授予了 SYSMONITOR 权限。)
以 user1 身份运行 SELECT 语句
操作结果取决于已授予 user1 的权限。
=> CREATE TABLE personal_data (SSN varchar (256));=> \c -user1;user1=> SET ROLE monitor;user1=> SELECT COUNT(*) FROM TABLES;COUNT ------- 1 (1 row)
由于您已分配了 SYSMONITOR 角色,因此 user1 可以看到 Tables 系统表中行的数量。在这个简单的示例中,数据库中只有一个表 (personal_data),因此 SELECT COUNT 返回一行。在实际情况中,SYSMONITOR 角色将看到数据库中的所有表。
使用下列命令检查分配有 SYSMONITOR 角色的用户是否可以访问系统表:
=> select table_name, is_monitorable from system_tables where table_name='<table_name>';
示例
以下示例将检查 SYSMONITOR 是否可以访问 current_session 系统表:
=> select table_name,is_monitorable from system_tables where table_name='current_session';table_name | is_monitorable -------------------------------- current_session | t
Is_monitorable 列中的 t 表示 SYSMONITOR 可以访问 current_session 系统表。
UDXDEVELOPER 角色是允许用户创建和替换用户所定义库的预定义角色。dbadmin
可以将此角色授予任何用户角色或非预定义角色。
具有 UDXDEVELOPER 角色的用户可以执行以下操作:
如果为库所有者或具有 DROP 权限:
CREATE OR REPLACE LIBRARY
要使用此角色的权限,您必须使用 SET ROLE 显式启用它。
具有 UDXDEVELOPER 角色的用户可以创建库,因此可以在数据库中安装任何 UDx 函数。UDx 函数以拥有数据库的 Linux 用户身份运行,因此可以访问 Vertica 有权访问的资源。
写得不好的函数会降低数据库性能。请仅将此角色授予您相信会负责任地使用 UDx 的用户。您可以通过在隔离模式下运行 UDx 并设置 FencedUDxMemoryLimitMB 配置参数来限制 UDx 可以使用的内存。
PUBLIC
角色是自动分配给所有新用户的预定义角色。它始终处于启用状态,并且无法删除或撤销。使用此角色授予所有数据库用户相同的最低权限集。
与所有其他角色一样,可以授予 PUBLIC
角色对单个对象和其他角色的权限。以下示例授予 PUBLIC
角色对表 publicdata
的 INSERT 和 SELECT 权限。这使所有用户都可以读取该表中的数据并插入新数据:
=> CREATE TABLE publicdata (a INT, b VARCHAR);
CREATE TABLE
=> GRANT INSERT, SELECT ON publicdata TO PUBLIC;
GRANT PRIVILEGE
=> CREATE PROJECTION publicdataproj AS (SELECT * FROM publicdata);
CREATE PROJECTION
=> \c - bob
You are now connected as user "bob".
=> INSERT INTO publicdata VALUES (10, 'Hello World');
OUTPUT
--------
1
(1 row)
以下示例向 PUBLIC
授予 employee
角色,以便所有数据库用户都具有 employee
权限:
=> GRANT employee TO public;
GRANT ROLE
PUBLIC
指定为被授予者的任何 GRANT
语句,子句 WITH ADMIN OPTION
都是无效的。
通过将角色授予其他角色,您可以构建角色层次结构,层次结构中较低的角色具有较窄的权限范围,而层次结构中较高的角色被授予角色及其权限的组合。当您按分层方式组织角色时,添加到较低级别角色的任何权限都会自动传播到它们上方的角色。
以下示例将创建两个角色,为其分配权限,然后将这两个角色分配给另一个角色。
创建名为 applog
的表:
=> CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
创建 logreader
角色并授予它对表 applog
的只读权限:
=> CREATE ROLE logreader;
CREATE ROLE
=> GRANT SELECT ON applog TO logreader;
GRANT PRIVILEGE
创建 logwriter
角色并授予它对表 applog
的写入权限:
=> CREATE ROLE logwriter;
CREATE ROLE
=> GRANT INSERT, UPDATE ON applog to logwriter;
GRANT PRIVILEGE
创建 logadmin
角色并授予它对表 applog
的删除权限:
=> CREATE ROLE logadmin;
CREATE ROLE
=> GRANT DELETE ON applog to logadmin;
GRANT PRIVILEGE
将 logreader
和 logwriter
角色授予角色 logadmin
:
=> GRANT logreader, logwriter TO logadmin;
创建用户 bob
并向他授予 logadmin
角色:
=> CREATE USER bob;
CREATE USER
=> GRANT logadmin TO bob;
GRANT PRIVILEGE
修改用户 bob
的帐户,使他的 logadmin
角色在登录时自动启用:
=> ALTER USER bob DEFAULT ROLE logadmin;
ALTER USER
=> \c - bob
You are now connected as user "bob".
=> SHOW ENABLED_ROLES;
name | setting
---------------+----------
enabled roles | logadmin
(1 row)
只能为用户启用已向其显式授予的角色。在前面的示例中,对于 bob
,无法启用 logreader
或 logwriter
角色。它们只能通过启用 logadmin
来间接启用。
如果使用 WITH ADMIN OPTION
将一个或多个角色授予另一个角色,则被授予“较高”角色的用户将继承对下级角色的管理访问权限。
例如,您可以按如下方式,将以前授予的角色 logreader
和 logwriter
修改为 logadmin
:
=> GRANT logreader, logwriter TO logadmin WITH ADMIN OPTION;
NOTICE 4617: Role "logreader" was already granted to role "logadmin"
NOTICE 4617: Role "logwriter" was already granted to role "logadmin"
GRANT ROLE
现在,用户 bob
有权通过他的 logadmin
角色将其两个下级角色授予其他用户,在本例中是将角色 logreader
授予用户 Alice
:
=> \c - bob;
You are now connected as user "bob".
=> GRANT logreader TO Alice;
GRANT ROLE
=> \c - alice;
You are now connected as user "alice".
=> show available_roles;
name | setting
-----------------+-----------
available roles | logreader
(1 row)
因为在将 logadmin
角色授予 bob
时未包括 WITH ADMIN OPTION
,所以他不能将该角色授予 alice
:
=> \c - bob;
You are now connected as user "bob".
=> GRANT logadmin TO alice;
ROLLBACK 4925: The role "logadmin" cannot be granted to "alice"
作为具有
DBADMIN
或
PSEUDOSUPERUSER
角色的超级用户,您可以使用
CREATE ROLE
创建角色,使用
DROP ROLE
删除角色。
=> CREATE ROLE administrator;
CREATE ROLE
没有为新角色授予任何权限或角色。超级用户必须向新角色授予权限和访问权限。
如果您尝试删除授予用户或其他角色的角色,Vertica 将返回一则回退消息:
=> DROP ROLE administrator;
NOTICE: User Bob depends on Role administrator
ROLLBACK: DROP ROLE failed due to dependencies
DETAIL: Cannot drop Role administrator because other objects depend on it
HINT: Use DROP ROLE ... CASCADE to remove granted roles from the dependent users/roles
若要强制执行删除操作,请使用 CASCADE
限定 DROP ROL
E 语句:
=> DROP ROLE administrator CASCADE;
DROP ROLE
您可以使用 GRANT 语句为角色分配权限,就像您为用户分配权限一样。有关可以授予哪些权限的信息,请参阅数据库权限。
为角色授予权限会立即影响到活动的用户会话。为角色授予权限时,此权限便立即可供已启用该角色的所有用户使用。
以下示例将创建两个角色,并为这两个角色分配对同一个表的不同权限。
创建名为 applog
的表:
=> CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
创建名为 logreader
和 logwriter
的角色:
=> CREATE ROLE logreader;
CREATE ROLE
=> CREATE ROLE logwriter;
CREATE ROLE
将 applog
的只读权限授予 logreader
,并将写入权限授予 logwriter
:
=> GRANT SELECT ON applog TO logreader;
GRANT PRIVILEGE
=> GRANT INSERT ON applog TO logwriter;
GRANT PRIVILEGE
使用 REVOKE 语句撤销角色的权限。撤销角色的权限会立即影响到处于活动状态的用户会话。当您撤销某个角色的权限时,通过该角色拥有此权限的用户将无法再使用此权限。
例如:
=> REVOKE INSERT ON applog FROM logwriter;
REVOKE PRIVILEGE
您可以使用 授权(角色) 将一个或多个角色分配给用户或其他角色:
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
REVOKE(角色)
可以从一个或多个被授权者(即用户或角色)撤销角色:
REVOKE [ ADMIN OPTION FOR ] role[,...] FROM grantee[,...] [ CASCADE ]
例如,以下语句从用户 bob
撤销 commenter
角色:
=> \c
You are now connected as user "dbadmin".
=> REVOKE commenter FROM bob;
REVOKE ROLE
您可以使用 ADMIN OPTION FOR
子句限定
REVOKE(角色)
。该子句从被授予者撤销将指定角色授予其他用户或角色的权限(由以前的 GRANT (Role)...WITH ADMIN OPTION
语句授予)。被授予者的当前角色不受影响。
以下示例撤销用户 Alice 授予和撤销 commenter
角色的权限:
=> \c
You are now connected as user "dbadmin".
=> REVOKE ADMIN OPTION FOR commenter FROM alice;
REVOKE ROLE
当您在会话中启用角色时,将获得分配给该角色的所有权限。您可以同时启用多个角色,从而获得这些角色的所有权限,以及已经直接授予您的任何权限。
默认情况下,对于用户,仅自动启用预定义角色。否则,在启动会话时,您必须使用 Vertica 函数
SET ROLE
显式启用分配的角色。
例如,dbadmin 创建 logreader
角色并将其分配给用户 alice
:
=> \c
You are now connected as user "dbadmin".
=> CREATE ROLE logreader;
CREATE ROLE
=> GRANT SELECT ON TABLE applog to logreader;
GRANT PRIVILEGE
=> GRANT logreader TO alice;
GRANT ROLE
用户 alice
必须启用新角色才能查看 applog
表:
=> \c - alice
You are now connected as user "alice".
=> SELECT * FROM applog;
ERROR: permission denied for relation applog
=> SET ROLE logreader;
SET
=> SELECT * FROM applog;
id | sourceID | data | event
----+----------+----------------------------+----------------------------------------------
1 | Loader | 2011-03-31 11:00:38.494226 | Error: Failed to open source file
2 | Reporter | 2011-03-31 11:00:38.494226 | Warning: Low disk space on volume /scratch-a
(2 rows)
您可以使用 SET ROLE ALL
启用对您的用户帐户可用的所有角色:
=> SET ROLE ALL;
SET
=> SHOW ENABLED_ROLES;
name | setting
---------------+------------------------------
enabled roles | logreader, logwriter
(1 row)
用户可以使用
SET ROLE NONE
禁用所有角色。此语句禁用当前会话的除预定义角色以外的所有其他角色:
=> SET ROLE NONE;
=> SHOW ENABLED_ROLES;
name | setting
---------------+---------
enabled roles |
(1 row)
默认情况下,会为新用户分配 PUBLIC 角色,在新会话开始时会自动启用此角色。通常,会创建其他角色并将它们分配给用户,但不会自动启用这些角色。相反,用户必须在每个新会话中使用
SET ROLE
显式启用为他们分配的角色。
您可以通过两种方式自动为用户启用角色:
在登录时为单个用户启用角色
在登录时为所有用户启用所有角色
为用户分配角色后,您可以通过使用
ALTER USER...DEFAULT ROLE
修改每个用户的配置文件来为该用户设置一个或多个默认角色。用户默认角色在用户会话开始时自动启用。如果用户通常依赖这些角色的权限来执行日常任务,您应该考虑为用户设置默认角色。
ALTER USER...DEFAULT ROLE
覆盖以前的默认角色设置。
以下示例显示了如何将 regional_manager
设置为用户 LilyCP
的默认角色:
=> \c
You are now connected as user "dbadmin".
=> GRANT regional_manager TO LilyCP;
GRANT ROLE
=> ALTER USER LilyCP DEFAULT ROLE regional_manager;
ALTER USER
=> \c - LilyCP
You are now connected as user "LilyCP".
=> SHOW ENABLED_ROLES;
name | setting
---------------+------------------
enabled roles | regional_manager
(1 row)
配置参数 EnableAllRolesOnLogin
指定是否在登录时为所有数据库用户启用所有角色。默认情况下,此参数设置为 0。如果设置为 1,Vertica 会在所有用户登录数据库时启用他们的角色。
您可以使用
ALTER USER...DEFAULT ROLE NONE
清除为用户分配的所有默认角色。例如:
=> ALTER USER fred DEFAULT ROLE NONE;
ALTER USER
=> SELECT user_name, default_roles, all_roles FROM users WHERE user_name = 'fred';
user_name | default_roles | all_roles
-----------+---------------+-----------
fred | | logreader
(1 row)
您可以通过三种方式获取有关角色的信息:
通过查询系统表 ROLES、USERS 和 GRANTS,分别获取有关角色、分配给角色的用户以及授予这些用户和角色的权限的全面信息。
HAS_ROLE
可获取该信息。
函数
HAS_ROLE
检查是否已将 Vertica 角色授予指定的用户或角色。非超级用户可以使用此函数检查自己的角色成员资格。超级用户可以使用它来确定其他用户和角色的角色分配。您还可以使用管理控制台检查角色分配。
在以下示例中,dbadmin
用户检查是否为用户 MikeL
分配了 admnistrator
角色:
=> \c
You are now connected as user "dbadmin".
=> SELECT HAS_ROLE('MikeL', 'administrator');
HAS_ROLE
----------
t
(1 row)
用户 MikeL
检查其是否具有 regional_manager
角色:
=> \c - MikeL
You are now connected as user "MikeL".
=> SELECT HAS_ROLE('regional_manager');
HAS_ROLE
----------
f
(1 row)
dbadmin 将 regional_manager
角色授予 administrator
角色。再次检查时,MikeL
会验证他现在具有 regional_manager
角色:
dbadmin=> \c
You are now connected as user "dbadmin".
dbadmin=> GRANT regional_manager to administrator;
GRANT ROLE
dbadmin=> \c - MikeL
You are now connected as user "MikeL".
dbadmin=> SELECT HAS_ROLE('regional_manager');
HAS_ROLE
----------
t
(1 row)
SHOW AVAILABLE ROLES
列出向您授予的所有角色:
=> SHOW AVAILABLE ROLES;
name | setting
-----------------+-----------------------------
available roles | logreader, logwriter
(1 row)
SHOW ENABLED ROLES
列出在会话中启用的角色:
=> SHOW ENABLED ROLES;
name | setting
---------------+----------
enabled roles | logreader
(1 row)
您可以单独或以联接方式查询表 ROLES、USERS 和 GRANTS,以获取有关用户角色、分配给这些角色的用户以及显式授予用户和通过角色隐式授予的权限的详细信息。
针对 ROLES 执行以下查询将返回用户可以访问的所有角色的名称,以及授予(分配)这些角色的角色。附加到角色的星号 (*) 表示用户可以将该角色授予其他用户:
=> SELECT * FROM roles;
name | assigned_roles
-----------------+----------------
public |
dbduser |
dbadmin | dbduser*
pseudosuperuser | dbadmin*
logreader |
logwriter |
logadmin | logreader, logwriter
(7 rows)
针对系统表 USERS 执行以下查询将返回所有具备 DBADMIN 角色的用户。附加到角色的星号 (*) 表示用户可以将该角色授予其他用户:
=> SELECT user_name, is_super_user, default_roles, all_roles FROM v_catalog.users WHERE all_roles ILIKE '%dbadmin%';
user_name | is_super_user | default_roles | all_roles
-----------+---------------+--------------------------------------+--------------------------------------
dbadmin | t | dbduser*, dbadmin*, pseudosuperuser* | dbduser*, dbadmin*, pseudosuperuser*
u1 | f | | dbadmin*
u2 | f | | dbadmin
(3 rows)
针对系统表 GRANTS 执行以下查询将返回向用户 Jane 或角色 R1 授予的权限。附加到权限的星号 (*) 表示用户可以将该权限授予其他用户:
=> SELECT grantor,privileges_description,object_name,object_type,grantee FROM grants WHERE grantee='Jane' OR grantee='R1';
grantor | privileges_description | object_name | object_type | grantee
--------+------------------------+-------------+--------------+-----------
dbadmin | USAGE | general | RESOURCEPOOL | Jane
dbadmin | | R1 | ROLE | Jane
dbadmin | USAGE* | s1 | SCHEMA | Jane
dbadmin | USAGE, CREATE* | s1 | SCHEMA | R1
(4 rows)