了解执行上下文

执行上下文由连接到相应会话的用户或登录名确定,或由执行(调用)相应模块的用户或登录名确定。它建立了检查执行语句或执行操作的权限时所依据的标识。执行上下文由一对安全标记表示:登录标记和用户标记。标记用于标识检查权限所针对的主要主体和次要主体,以及用来对标记进行身份验证的源。连接 SQL Server 实例的登录帐户有一个登录标记,还具有一个或多个用户标记(取决于帐户所访问的数据库数量)。

用户和登录安全标记

用户或登录安全标记包含下列内容:

  • 一个服务器或数据库主体作为主要标识

  • 一个或多个主体作为次要标识

  • 零个或多个身份验证器

  • 主要标识和次要标识的特权和权限

主体是可以请求 SQL Server 资源的个体、组和进程。体按其影响范围分为下列几类:Windows 级别、SQL Server 级别或数据库级别。有关详细信息,请参阅主体(数据库引擎)

身份验证器是保证标记真实性的主体、证书或非对称密钥。标记的身份验证器通常是 SQL Server 的实例。有关身份验证器的详细信息,请参阅使用 EXECUTE AS 扩展数据库模拟。有关证书和非对称密钥的详细信息,请参阅加密层次结构

登录标记在 SQL Server 的实例上有效。它包含检查关联的服务器级别权限和数据库级别权限所针对的主要标识和次要标识。主要标识是登录名本身。次要标识包括从角色和组继承的权限。

用户标记仅对特定的数据库有效。它包含检查数据库级别权限所针对的主要标识和次要标识。主要标识是数据库用户本身。次要标识包括从数据库角色继承的权限。用户标记不包含服务器角色成员身份,并且不享有授予标记中的标识的服务器级别权限,包括授予服务器级别 public 角色的那些权限。

如果显式创建了 SQL Server 登录或用户帐户,为该帐户创建的登录或用户 ID 将被用作登录或用户标记中的主要标识。当主体隐式访问 SQL Server 的实例,或者通过 CONTROL SERVER 权限访问数据库时,登录标记中的主要标识将是默认的 public 角色。用户标记中的主要标识是 public。

重要说明重要提示

sysadmin 固定服务器角色的成员始终将 dbo 作为其用户标记的主要标识。

登录标记示例

Mary 有一个 SQL Server 登录帐户,该登录帐户映射到她的 Windows 帐户 MyDomain\Mary。为了查看有关为她创建的登录标记的信息,Mary 运行了以下语句:

SELECT principal_id, sid, name, type, usage FROM sys.login_token;
GO

结果集与下面所列类似:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

261 0x583EA MyDomain\Mary WINDOWS LOGIN GRANT OR DENY

2 0x02 public SERVER ROLE GRANT OR DENY

(2 row(s) affected)

结果集显示 Mary 的 Windows 帐户是她的登录标记的主要标识。在创建她的登录帐户时创建的 principal_id 被用作登录标记中的主要 principal_id。public 角色作为次要标识列出,因为 Mary 是该默认角色的成员。如果 Mary 是其他服务器级别角色的成员,它们也会作为次要标识列出。创建登录帐户时,SQL Server 的实例对她的 Windows 帐户进行了验证。因此,当 Mary 登录 SQL Server 的实例时,该实例将是她的登录标记的身份验证器。因为 SQL Server 的实例是 Mary 的登录标记的身份验证器,所以查询中不会返回主体、证书或非对称密钥之类的身份验证器。

用户标记示例

Mary 对她具有访问权限的每个数据库有一个用户标记。在第一个示例中,Mary 连接到 master 数据库。为了查看有关在 master 数据库中为她创建的用户标记的信息,Mary 运行了以下语句:

SELECT principal_id, sid, name, type, usage FROM sys.user_token;
GO

结果集与下面所列类似:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

2 NULL guest SQL USER GRANT OR DENY

0 NULL public ROLE GRANT OR DENY

(2 row(s) affected)

结果集显示 Mary 不是 master 数据库中的显式用户,但可以通过 guest 帐户进行访问。她的用户标记的主要标识是 guest 用户。public 角色作为次要标识列出,因为 guest 是该默认角色的成员。Mary 在 master 数据库中的用户标记包含 guest 用户和 public 角色的所有数据库级别的特权和权限。

在下面的示例中,在 Sales 数据库中为 Mary 创建了一个显式用户帐户。另外,Mary 还被添加到该数据库的 db_ddladmin 固定数据库角色中。Sales 作为当前数据库时,Mary 再次运行 SELECT * FROM sys.user_token。

结果集与下面所列类似:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

5 0x36CC4BBD1 Mary SQL USER GRANT OR DENY

0 NULL public ROLE GRANT OR DENY

16387 NULL db_ddladmin ROLE GRANT OR DENY

此结果集反映了在 Sales 数据库中为 Mary 创建的用户标记。因为 Mary 是作为用户显式添加到 Sales 数据库中的,所以她作为主要标识列出。Mary 所属的两个角色作为次要标识列出。Mary 的用户标记的身份验证器是 SQL Server 的实例。

切换执行上下文

在 SQL Server 中,可以通过在 EXECUTE AS 语句中指定用户名或登录名来显式更改会话的执行上下文。通过在模块定义的 EXECUTE AS 子句中指定用户名或登录名,可以隐式更改模块(例如,存储过程、触发器或用户定义函数)的执行上下文。当执行上下文切换为其他用户或登录帐户时,SQL Server 将检查该帐户对登录标记和用户标记的权限。实际上,将在会话期间或模块执行期间模拟该帐户。有关详细信息,请参阅了解上下文切换