阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SQL Server 2016新功能之 Row-Level Security

122次阅读
没有评论

共计 1731 个字符,预计需要花费 5 分钟才能阅读完成。

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

SQL Server 2016 新功能之 Row-Level Security 这是全部表的数据的截图

然后添加 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 字段 (也就是我们建表的那个销售代表字段了)

SQL Server 2016 新功能之 Row-Level Security
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);
SQL Server 2016 新功能之 Row-Level Security

然后我们看下查询的结果

SQL Server 2016 新功能之 Row-Level Security
EXECUTE AS USER = 'Sales1';  
SELECT * FROM Sales;   

REVERT;  
  
EXECUTE AS USER = 'Sales2';  
SELECT * FROM Sales;   
REVERT;  
  
EXECUTE AS USER = 'Manager';  
SELECT * FROM Sales;   
REVERT;  
SQL Server 2016 新功能之 Row-Level Security

SQL Server 2016 新功能之 Row-Level Security

 效果就是这样,当然如果是要设置不同的过滤条件,设置不同的字段的时候,是可以通过上文的函数里面的代码和安全策略进行设置的。按照这个过滤情况,如果登录用户非 Sales1 Sales2 Manager 3 个其中之一,是什么都查询不了的。

另外,用户无法删除被过滤的数据。比方说 Sales1 不能删除或修改 OrderID = 3 的数据。

RLS 的出现也是能帮助我们减轻一定功能上面的实现的~

简单的演示了一下这个 RLS 的功能~ 分享得不够好的地方烦请大家拍砖。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/136889.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1731字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中