Sql Server 2016新功能之 Row-Level Security


Sql Server 2016 有一個新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原來我是個英語渣_(:з」∠)_)

直接上例子。這個功能相當通過對表添加一個函數作為過濾規則,使得擁有不同條件的用戶(或者登錄名) 之類的,只能獲取到符合條件的數據。相對來說是提供了那么一點的便捷性,當然也增加了數據的安全性,相當於每個用戶連接進來只能看到

符合規則的數據(當然,這里的用戶只是一個舉例。其實是可以通過編寫過濾函數來實現的)

舉個例子

有三個用戶 Sales1 ,Sales 2 ,Manager 3個數據庫用戶,然后用一個Sales的表來寄存他們的訂單記錄

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

這是全部表的數據的截圖

然后添加3個用戶,分別就是Sales1 Sales2 Manager 3個用戶,分別對他們的賦予Sales表的查詢和刪除(用於測試刪除功能) 的權限。

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; 

 

 

然后以下是這個功能的核心部分。首先我們創建一個過濾函數,然后將這個過濾函數添加到這個表的安全策略里面,就可以看到效果了。

函數邏輯很簡單,傳入一個@SalesRep 的名稱,用於匹配當前的 User_Name。匹配了才返回數據

然后下面一行是創建了一個安全策略,並且在Sales 的表里面使用函數 fn_securitypredicate 作為表的篩選器。傳入函數的參數選定為 SalesRep 字段(也就是我們建表的那個銷售代表字段了)

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的功能~分享得不夠好的地方煩請大家拍磚.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM