用户可以模拟其他用户或登陆的权限来执行查询,并且在查看用户和登录的权限时,结果会受到模拟上下文的影响。当执行EXECUTE AS命令时,原始用户的安全上下文会进行切换,除了ORIGINAL_LOGIN之外,其他函数都会返回模拟上下文的Login和User信息。

一,指定Session的安全上下文

默认情况下,一个会话在用户登陆时开始,在用户退出时结束,用户的权限决定了用户的操作。当用户使用EXECUTE AS 命令时,当前用户的权限切换到制定的用户或登陆的安全上下文,以模拟对象的权限来执行操作。EXECUTE AS 命令用于设置会话的执行上下文:

{ EXEC | EXECUTE } AS { LOGIN | USER } = 'domain\name' | CALLER
...
REVERT;

把执行上下文切换到指定的Login 或User,参数CALLER 只用于模块内部,以模块调用者的安全上下文来执行。

要结束权限模拟,可以执行命令 REVERT,该命令用于恢复当前用户的原始执行上下文。

当执行EXECUTE AS 命令之后,用户的安全上下文会被切换为指定的用户。ORIGINAL_LOGIN() 返回最原始的Login名称,不受上下文切换的影响:

ORIGINAL_LOGIN( ) 

其他返回用户和Login的函数,都是基于当前上下文的。比如,SESSION_USER返回当前安全上下文的用户名称,如果该函数在EXECUTE AS 命令之后被调用,那么上下文被切换,SESSION_USER返回模拟上下文的用户名称:

SESSION_USER 

二,指定模块的安全上下文

在SQL Server中,你可以定义用户定义模块(内联表值函数、存储过程、queue和触发器)的执行上下文。默认值是CALLER,也就是说,使用模块调用者的安全上下文来执行:

WITH EXECUTE AS { CALLER | SELF | OWNER | 'user_name' }  

参数注释

  • CALLER:以模块调用者的安全上下文来执行,模块的调用者不仅要有调用模块的权限,还要有访问被模块引用的对象的权限。
  • SELF:指定以模块的创建者或修改者的安全上下文来执行
  • OWNER:以模块的所有者(Owner)的安全上下文来执行,如果没有指定对象的Owner,那么以Schema的Owner来执行。

数据库对象的Owner可以通过命令ALTER AUTHORIZATION来修改,常见的class_type是:OBJECT、ROLE、SCHEMA :

ALTER AUTHORIZATION
ON [ <class_type>:: ] entity_name
TO { principal_name | SCHEMA OWNER }

通过指定模块的执行上下文,你可以控制数据库引擎使用哪个用户的安全上下文来验证被模块引用的对象的权限。也就是说,通过使用模块的EXECUTE AS 子句,可以指定以特定的用户来验证数据库对象的权限,而不仅仅是使用模块的调用者。

可以把执行用户定义的模块的权限分为两部分:执行模块和访问被模块引用的对象,一个用户可以只授予执行模块的权限,而不需授予操作被模块引用的对象的权限。对于这种情况,模块的EXECUTE AS 子句必须指定一个用户,该用户有权限访问被模块引用的对象。

对于模块的EXECUTE AS 设置,可以通过 sys.sql_modules 或 sys.service_queues的 execute_as_principal_id来查看,该字段有三种类型的值:

  • NULL: 默认设置,EXECUTE AS CALLER
  • -2:EXECUTE AS OWNER
  • ID 值:特定的Database Principal ID

对于模块的调用者而言,其必须有调用(EXECUTE)模块的权限。当指定特定的模拟用户时,当前用户必须有模拟的权限。

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'

参考文档:

EXECUTE AS Clause (Transact-SQL)

EXECUTE AS (Transact-SQL)

最新文章

  1. CSS 魔法系列:纯 CSS 绘制三角形(各种角度)
  2. GFW-新闭关锁国政策
  3. MySQL 5.7版本sql_mode=only_full_group_by问题
  4. Hadoop2.4.x 实例测试 WordCount程序
  5. struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组
  6. MVC开发模式
  7. Java——jdk1.5新特性
  8. Ubuntu中MySQL中文乱码解决
  9. Android 进入另外一个窗体的两种方法
  10. ON COMMIT PRESERVE ROWS
  11. Spring AOP 的实现机制
  12. 通用c程序Makefile
  13. bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
  14. Elasticsearch学习系列之term和match查询
  15. 模型标准化——预测模型标记语言(PMML)
  16. shell中引号的妙用
  17. C# 正则表达式 判断各种字符串(如手机号)
  18. haml参考大全
  19. 自测之Lesson16:并发通信
  20. Linux之手动设置IP地址

热门文章

  1. JAVA学习之路 (五) 类
  2. 在sun jdk 8镜像基础上构建maven 3的docker镜像
  3. 数学--数论--HDU 6128 Inverse of sum (公式推导论)
  4. Centos 搭建wordpress个人博客
  5. libevent(十)bufferevent 2
  6. Intersection of Two Linked Lists (求两个单链表的相交结点)
  7. E - Help Jimmy POJ - 1661 dp
  8. blesta运行造成阿里云服务器CPU频繁超载的原因分析
  9. js 调用webservice及nigix解决跨域问题
  10. 【poj 2406】Power Strings 后缀数组DC3模板 【连续重复子串】