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 的数据库中的角色的权限,且您在名为 acctginventory 的数据库之上执行分布式查询,则您的查询不可访问 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;