-
- SET ROLE 语句
使用 SET ROLE 语句来启用用户定义的角色的权限。此语句是对 SQL 的 ANSI/ISO 标准的扩展。
语法
元素 | 描述 | 限制 | 语法 |
role | 要启用的角色的名称 | 必须在数据库中已存在,且必须已被授权给用户,但不可为内建的角色。如果括在引号之间,则 role 区分大小写。 | 所有者名称; |
用法
被授予角色的任何用户都可通过使用 SET ROLE 语句来启用该角色。您一次仅可启用一个角色。如果您在已设置角色之后执行 SET ROLE 语句,则新的角色取代旧的角色作为当前的角色。
如果用户当前不持有该角色,或如果该角色为内建的角色,则 SET ROLE 语句返回错误。(由内建的角色持有的访问权限,诸如 EXTEND 角色或 DBSECADM 角色,总是生效,且如果用户持有那个角色,则不要求通过 SET ROLE 语句激活。)
当 DBA 发出 GRANT DEFAULT ROLE 语句时,用户可被授予一个数据库实例的缺省角色。如果对于当前数据库中的角色不存在缺省的角色,则缺省地分配角色 NULL 或 NONE。在此上下文中,NULL 与 NONE 是同义词。角色 NULL 和 NONE 可没有权限。要将您的角色设置为 NULL 或 NONE,会禁用您的当前角色。
当请您使用 SET ROLE 来启用角色时,您获得该角色的权限,除了 PUBLIC 以及您自己的权限之外。如果将一角色授予已分配给您的另一角色,则您获得两个角色的权限,除了 PUBLIC 的任何权限和您自己的权限之外。
在 SET ROLE 成功地执行之后,指定的角色保持有效,直到关闭当前数据库或用户执行另一 SET ROLE 语句为止。然而,仅用户,不是角色,保持在会话期间创建了的任何数据库对象的拥有权,比如表。
仅在当前数据库之内,角色才在作用域中。您不可使用您从角色获得的权限来访问另一数据库中的数据。例如,如果您有来自名为 acctg 的数据库中的角色的权限,且您在名为 acctg 和 inventory 的数据库之上执行分布式查询,则您的查询不可访问 inventory 数据库中的数据,除非您还被授予了 inventory 数据库中的适当的权限。作为安全预防措施,用户仅从角色持有的自主访问权限不可通过视图或通过触发器的活动来提供对当前数据库外部的表的访问。
如果您的数据库支持显式的事务,您必须在事务的外部发出 SET ROLE 语句。如果您的数据库符合 ANSI,则 SET ROLE 必须是新的事务的第一个语句。如果在事务是活动的时候执行 SET ROLE 语句,则发生错误。要获取更多关于初始隐式的事务的 SQL 语句的信息,请参阅 SET SESSION AUTHORIZATION 和事务。
如果执行 SET ROLE 语句作为触发器或 SPL 例程的一部分,且随同 WITH GRANT OPTION 将该角色授予了触发器或 SPL 例程的所有者,则启用该角色,即使未授予您该角色。例如,此代码片段设置角色,然后在查询之后放弃它:
EXEC SQL set role engineer;
EXEC SQL select fname, lname, project
INTO :efname, :elname, :eproject FROM projects
WHERE project_num > 100 AND lname = 'Larkin';
printf ("%s is working on %s\n", efname, eproject);
EXEC SQL set role NULL;
设置缺省的角色
DBA 或数据库的所有者可发出 GRANT DEFAULT ROLE 语句来对指定的用户列表或对 PUBLIC 指定一现有的角色为缺省的角色。不像非缺省的角色那样,缺省的角色不要求 SET ROLE 语句来启用它。当为用户分配缺省的角色时,将一对数据库的隐式的连接授予该用户。
在下一示例中的三个语句中的每一个分别对角色执行下列操作之一:
- 声明名为 Engineer 的角色
- 将对 locomotives 表的 Select 权限分配给 Engineer 角色
- 定义 Engineer 作为用户 jgould 的缺省的角色。
EXEC SQL CREATE ROLE 'Engineer';
EXEC SQL GRANT SELECT ON locomotives TO 'Engineer';
EXEC SQL GRANT DEFAULT ROLE 'Engineer' TO jgould;
如果 jgould 随后使用 SET ROLE 语句来启用一些其他角色,则通过执行下列语句,jgould 以 Engineer 替代那个角色作为缺省的角色:
SET ROLE DEFAULT;
如果您没有缺省的角色,则 SET ROLE DEFAULT 使得 NONE 成为您的缺省角色,仅留下已经显式地授予了您的 username 或 PUBLIC 的那些权限。在 GRANT DEFAULT ROLE 将您的缺省角色更改为新的缺省角色之后,执行 SET ROLE DEFAULT 恢复您最近被授予的缺省角色,即使当您连接到了数据库时此角色不是您的缺省角色。
如果未授予 PUBLIC 一个缺省角色,但授予不同的角色作为一单个用户的缺省角色,则单独授予的缺省角色优先,如果那个用户发出 SET ROLE DEFAULT 或连接到数据库的话。