sp_set_session_context存储过程和SESSION_CONTEXT函数出现在了SQL Server 2016 CTP3.0上。它俩配合起来的作用是sp_set_session_context用于设置一个键值作为会话的上下文(最大不超过256kb),而这个上下文的内容可以通过定义好的键名称在会话内任何时候读取。

比如:

EXEC sp_set_session_context 'user_id', 4;
SELECT SESSION_CONTEXT(N'user_id');

这东西到底有什么用呢?

这东西非常有用。我们都知道用户的身份就代表了当前会话的安全上下文,那是基于Windows身份认证的应用程序才是这样的。在大型的项目中,我们不可能为每个用户去新建一个SQL Server Login。那么这东西对于那些通过应用程序中间层的项目来说就非常有用了,因为是应用程序用特定的用户身份连接到SQL Server数据库,每个用户的身份都是相同。那么有了这个sp_set_session_context存储过程和SESSION_CONTEXT函数的出现,我们就可以为每个连接设定好它们自己的安全上下文。比如说每个用户登录账户、密码和类别属性的信息是存储在数据库表中的,那么应用程序获取用户身份登录信息之后用同样的SQL Server Login账户开启连接到SQL Server数据库查询数据,但是为每个用户设定属于他们各自的安全上下文。

---------------- update 2016/02/20 --------------------------------------------------------------

这里有个安全的隐患,就是每个用户都有权限调用sp_set_session_context存储过程设置他们自己的会话安全上下文,这样很容易出现身份盗用。比如我可以设置任何人都可以设置自己是Manager或者CEO。这层的安全控制需要应用程序中间层的配合完成。就像如果SQL Server启用了连接池(Connection Pooling)后需要应用程序每次在开启新会话的时候重新设置SET OPTIONS这些信息一样,也是由应用程序中间层在初始化会话的时候调用sp_set_session_context设置用户的安全上下文。

这里又有另外一个问题,假设我采用中间层应用程序的方法来连接数据库,但是SQL Server Audit中却没有记录会话上下文的信息。SQL Server Audit只告诉我们SQL Server Login和Database User的名称。这里我提交了一个建议给微软,希望可以把会话上下文的信息加入到SQL Server Audit文件中。

https://connect.microsoft.com/SQLServer/feedback/details/2382291

参考:

SESSION_CONTEXT (Transact-SQL)

sp_set_session_context (Transact-SQL)

SQL Server ->> SQL Server 2016新特性之 -- sp_set_session_context存储过程和SESSION_CONTEXT函数的更多相关文章

  1. SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

    原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一 ...

  2. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  3. SQL Server 2016新特性:DROP IF EXISTS

    原文:SQL Server 2016新特性:DROP IF EXISTS  在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧 ...

  4. SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Row-Level Security(行级别安全控制)

    SQL Server 2016 CPT3中包含了一个新特性叫Row Level Security(RLS),允许数据库管理员根据业务需要依据客户端执行脚本的一些特性控制客户端能够访问的数据行,比如,我 ...

  5. Entity Framework 6 Code First新特性:支持存储过程

    Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...

  6. SQL Server 2016新特性:Live Query Statistics

    SSMS可以提供可以查看正在执行的计划.live query plan可以查看一个查询的执行过程,从一个查询计划操作到另外一个查询计划操作.live query plan提供了整体的查询运行进度和操作 ...

  7. SQL Server 2016新特性:In-Memory OLTP

    存储格式修改 在2014,2016中修改了内存优化表的存储格式,新的格式是序列的并且the database is restarted once during database recovery.   ...

  8. SQL Server ->> SQL Server 2016新特性之 --- Query Store

    前言 SQL Server 2016引入新的查询语句性能监控.调试和优化工具/功能 -- Query Store.以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV ...

  9. SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

    Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一 ...

随机推荐

  1. 使用try-with-resource遇到的问题

    JDK1.7增加了try-with-source语法.在try中声明一个或者多个资源,在try块代码执行完成后自动关闭流,不用再写close()进行手动关闭. try(Resource res = x ...

  2. vue 初步了解provide/inject

    provider/inject:简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量. 需要注意的是 provide / inject这对选项需要一起使用, ...

  3. Oracle 如何修改列的数据类型

    链接:http://www.cnblogs.com/david-zhang-index/archive/2012/04/10/2441015.html 对字段操作 操作方法 更新字段名 alter t ...

  4. openstf安装手记

    一款基于nodejs+jade模板开发的手机群控框架,你可以在此基础上拿来测试设备,或者群操作等等. 主要核心技术在于如何在不root的情况下实时流畅录屏,以及远程操作手机. 官方git https: ...

  5. 添加ASP.NET网站资源文件夹

    ASP.NET应用程序包含7个默认文件夹,分别为Bin.APP_Code.App_GlobalResources.App_LocalResources.App_WebReferences.App_Br ...

  6. unittest之装饰器

    前面讲到 unittest 里面 setUp 可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间.于是就想是不是可以 ...

  7. target与currentTarget区别

    target在事件流的目标阶段:currentTarget在事件流的捕获,目标及冒泡阶段.只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的 ...

  8. MySQL备份和还原数据

    MySQL备份和还原数据 导出整个数据库 mysqldump -uroot -p database_name > db_backup.sql 导入整个数据库 mysql -uroot -p da ...

  9. Parsing Failure in config.xml: java.lang.IllegalArgumentException: In production mode, it's not allowed to set a clear text value to the property

    Step1). in your "setDomainEnv.sh" script set the "PRODUCTION_MODE=false" or use ...

  10. Hibernate各种查询操作(二)

    一.QBC的查询方式 使用QBC不在需要写hql语句,而是使用criteria对象的各种方法来实现. 1.查询所有 //使用QBC方式查询所有 @Test public void test11(){ ...