SET SESSION AUTHORIZATION 语句

SET SESSION AUTHORIZATION 语句让您在当前的会话中执行的数据库操作之下更改用户名称。

语法

元素 描述 限制 语法
auth_variable 对于在 user_identifieruser_ID_variable 中指定的登录名称持有有效的口令的主变量 变量必须为定长的字符数据类型。它的值与 password 有相同的限制。 对于变量名称必须符合特定于语言的规则。
password 指定用户的口令的用引号括起来的字符串。 必须为那个用户的口令,且不多于 32 字节 用引号括起的字符串
user_identifier 用引号括起来的应用的有效的登录名称。引号定界符保持字母大小写。 不超过 32 字节的授权标识符 用引号括起的字符串
user_ID_variable 持有用户标识符的值的 ESQL/C 主变量的名称。 变量必须为定长字符数据类型。它的值与 user_identifier 有相同的限制。 必须符合变量名称的特定于语言的规则。

用法

此语句允许您采用另一用户的身份,包括自主访问控制(DAC)和基于标签的访问控制(LBAC)凭证。您还可在支持 GBase 8s 受信的上下文的 API 中使用此语句,来切换在受信的连接上的用户 ID。

同时需要 DBA 和 SETSESSIONAUTH 访问权限来执行此语句。除非当您启动您已持有对 PUBLIC(或对于您在 SET SESSION AUTHORIZATION 语句中指定其名称的用户)的 SETSESSIONAUTH 权限的会话,且您还持有 DBA 权限时,此语句失败并报错。

如果数据库服务器已经从不支持基于标签的访问控制的旧版本转换了,则在迁移进程中,自动地授予持有 DBA 权限的用户对于 PUBLIC 的 SETSESSIONAUTH 访问权限。如果数据库服务器已经被初始化作为支持 LBAC 安全策略的版本,则持有 DBSECADM 角色的用户可将 SETSESSIONAUTH 权限授予其他用户。由于每一用户的安全凭证决定在受保护的表中可访问那些数据行,因此 DBSECADM 在授予 SETSESSIONAUTH 权限和指定它的作用域时应小心行事。

新的身份在当前数据库中保持有效,直到您再次执行 SET SESSION AUTHORIZATION 为止,或直到您关闭当前数据库为止。当您使用此语句时,指定的 user 必须有对当前数据库的 Connect 权限。此外,DBA 不可将新的授权标识符设置到 PUBLIC 组,也不可设置到当前数据库中现有的角色。

将会话设置到另一用户会导致在当前活动的数据库服务器中用户名称的更改。就此数据库服务器进程而言,在指定的 user 通过一些管理实用程序访问数据库服务器时,完全失去任何权限。此外,新的会话 user 不能以获得的身份开启器任何管理操作(例如,执行实用程序)。

在 SET SESSION AUTHORIZATION 语句成功地执行之后,放弃通过先前的用户启用的任何角色。如果您希望采用已被授予指定的 user 的角色,则您必须使用 SET ROLE 语句。数据库服务器不自动地启用 user 的缺省角色。

在 SET SESSION AUTHORIZATION 成功地执行之后,在数据库服务器在 RESTRICTED 模式下使用新的授权标识符时,放入任何 DBA 创建了的所有者权限的 UDR,这可影响在远程数据库中对象之上 的 UDR 的操作期间的访问权限。要获取更多关于 RESTRICTED 模式的信息,请参阅在 GBase 8s SQL 参考指南 中的 sysprocedures 系统目录表。

当您通过执行 SET SESSION AUTHORIZATION 语句来采用另一用户的身份时,您仅可在当前数据库中执行操作。您不可在当前数据库之外的数据库对象上执行操作,诸如远程表。此外,您不可执行 DROP DATABASE 或 RENAME DATABASE 语句,即使真实的用户或实际的用户拥有该数据库。

您可使用此语句或者来直接获取对数据的访问,或者来授予数据库操作处理所需的数据库级权限或表级权限。下列示例展示如何使用 SET SESSION AUTHORIZATION 语句来获取表级权限:
SET SESSION AUTHORIZATION TO 'cathl';
          GRANT ALL ON customer TO 'mary';
          SET SESSION AUTHORIZATION TO 'mary';
          UPDATE customer SET fname = 'Carl' WHERE lname = 'Pauli';

如果您用引号括起 user,则该名称区分大小写,且完全按输入形式存储该名称。在符合 ANSI 的数据库中,如果您不使用引号作为定界符,则以大写字母存储授权标识符,除非设置 ANSIOWNER 环境变量来防止从小写字母转化为大写。

下列“开放数据库连接”(ODBC)API 示例在与授权要求的受信的连接上启用用户 ID 切换:

SQLExecDirect(hstmt,"SET SESSION AUTHORIZATION TO 'zurbie' USING 'pass01'",SQL_NTS);
在上述函数调用中,
  • 'zurbie' 为在此会话中的随后的操作指定授权标识符
  • pass01 必须为用户 zurbie 的当前口令。
注:

除了在非敌对的环境中,'pass01' 不是登录口令的推荐的示例,因为在某些语言环境中,它容易被猜出。