Sql Server 2016 有一個新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原來我是個英語渣_(:з」∠)_)數據庫
直接上例子。這個功能至關經過對錶添加一個函數做爲過濾規則,使得擁有不一樣條件的用戶(或者登陸名) 之類的,只能獲取到符合條件的數據。相對來講是提供了那麼一點的便捷性,固然也增長了數據的安全性,至關於每一個用戶鏈接進來只能看到安全
符合規則的數據(固然,這裏的用戶只是一個舉例。實際上是能夠經過編寫過濾函數來實現的)函數
舉個例子測試
有三個用戶 Sales1 ,Sales 2 ,Manager 3個數據庫用戶,而後用一個Sales的表來寄存他們的訂單記錄spa
CREATE TABLE Sales ( OrderID int, SalesRep sysname, Product varchar(10), Qty int ); INSERT Sales VALUES (1, 'Sales1', 'Valve', 5), (2, 'Sales1', 'Wheel', 2), (3, 'Sales1', 'Valve', 4), (4, 'Sales2', 'Bracket', 2), (5, 'Sales2', 'Wheel', 5), (6, 'Sales2', 'Seat', 5); -- View the 6 rows in the table SELECT * FROM Sales; go
這是所有表的數據的截圖code
而後添加3個用戶,分別就是Sales1 Sales2 Manager 3個用戶,分別對他們的賦予Sales表的查詢和刪除(用於測試刪除功能) 的權限。blog
CREATE USER Manager WITHOUT LOGIN; CREATE USER Sales1 WITHOUT LOGIN; CREATE USER Sales2 WITHOUT LOGIN; GRANT SELECT,delete ON Sales TO Manager; GRANT SELECT,delete ON Sales TO Sales1; GRANT SELECT,delete ON Sales TO Sales2;
而後如下是這個功能的核心部分。首先咱們建立一個過濾函數,而後將這個過濾函數添加到這個表的安全策略裏面,就能夠看到效果了。it
函數邏輯很簡單,傳入一個@SalesRep 的名稱,用於匹配當前的 User_Name。匹配了才返回數據table
而後下面一行是建立了一個安全策略,而且在Sales 的表裏面使用函數 fn_securitypredicate 做爲表的篩選器。傳入函數的參數選定爲 SalesRep 字段(也就是咱們建表的那個銷售表明字段了)class
CREATE FUNCTION fn_securitypredicate(@SalesRep AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager'; CREATE SECURITY POLICY SalesFilter ADD FILTER PREDICATE dbo.fn_securitypredicate(SalesRep) ON dbo.Sales WITH (STATE = ON);
而後咱們看下查詢的結果
EXECUTE AS USER = 'Sales1'; SELECT * FROM Sales; REVERT; EXECUTE AS USER = 'Sales2'; SELECT * FROM Sales; REVERT; EXECUTE AS USER = 'Manager'; SELECT * FROM Sales; REVERT;
效果就是這樣,固然若是是要設置不一樣的過濾條件,設置不一樣的字段的時候,是能夠經過上文的函數裏面的代碼和安全策略進行設置的。按照這個過濾狀況,若是登陸用戶非Sales1 Sales2 Manager 3個其中之一,是什麼都查詢不了的。
另外,用戶沒法刪除被過濾的數據。比方說 Sales1 不能刪除或修改OrderID = 3 的數據。
RLS的出現也是能幫助咱們減輕必定功能上面的實現的~
簡單的演示了一下這個RLS的功能~分享得不夠好的地方煩請你們拍磚.