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)

相關文章
相關標籤/搜索