SQL Server ->> SQL Server 2016新特性之 -- sp_set_session_context存储过程和SESSION_CONTEXT函数

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');

 

这东西到底有什么用呢?session

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

 

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

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

 

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

 

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

 

参考:it

SESSION_CONTEXT (Transact-SQL)io

sp_set_session_context (Transact-SQL)

相关文章
相关标签/搜索