博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server 2016新功能之 Row-Level Security
阅读量:4618 次
发布时间:2019-06-09

本文共 2020 字,大约阅读时间需要 6 分钟。

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的功能~分享得不够好的地方烦请大家拍砖.

 

转载于:https://www.cnblogs.com/Gin-23333/p/6039306.html

你可能感兴趣的文章
Python 总结题目
查看>>
Gym100212C Order-Preserving Codes
查看>>
TC1570 DesertWind
查看>>
ARC076F Exhausted
查看>>
TC10738 TheContest
查看>>
bzoj4754 [JSOI2016]独特的树叶
查看>>
多校2019 Contest 2 hdu6602 Longest Subarray
查看>>
CF277D Google Code Jam
查看>>
Redis相关面试题
查看>>
LeetCode 1101. The Earliest Moment When Everyone Become Friends
查看>>
LeetCode 1135. Connecting Cities With Minimum Cost
查看>>
LeetCode 1102. Path With Maximum Minimum Value
查看>>
LeetCode 1061. Lexicographically Smallest Equivalent String
查看>>
LeetCode 841. Keys and Rooms
查看>>
LeetCode 1043. Partition Array for Maximum Sum
查看>>
LeetCode 923. 3Sum With Multiplicity
查看>>
LeetCode 750. Number Of Corner Rectangles
查看>>
LeetCode 983. Minimum Cost For Tickets
查看>>
LeetCode 723. Candy Crush
查看>>
LeetCode 881. Boats to Save People
查看>>