行级安全性,一行有多个用户

时间:2017-10-02 15:41:06

标签: sql sql-server row-level-security security-policy

我试图在SQL Server 2016中实现行级安全性。

问题是,我可以让多个用户拥有对给定行的读取权限,当我在谓词中写出一些复杂的条件时,性能变得非常非常糟糕。

我尝试将所有用户名保留在表格的一列和谓词中,以便SYSTEM_USER搜索% LIKE % domain\john.wick;domain\red.eagle;domain\spartak.something....但性能很低。

我的受控表中一行的Usernames列中的值示例:

CREATE FUNCTION fn_securitypredicate(@Usernames AS nvarchar(4000)) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 as Result WHERE @Usernames LIKE '%' + SYSTEM_USER + '%'

这是我的功能:

CREATE SECURITY POLICY [Policy]   
ADD FILTER PREDICATE [fn_securitypredicate]([Usernames])   
ON [dbo].[Products];  

这个执行时间从2秒变为50秒。任何改进建议。

awk '($1 ~ /[0-9]+\.$/){sub("Ord","Card",$2)} 1' OFS="\t" Input_file

1 个答案:

答案 0 :(得分:1)

这是我为前任团队提出的解决方案。

这需要一个用户表,一个用户权限表以及受控表上的权限列。它还应具有用户组和用户组权限表,以便与用户进行扩展。

users                   user_permissions            controlled_table
+-----------+---------+ +---------+---------------+ +---------------+------+------+
| user_name | user_id | | user_id | permission_id | | permission_id | pk_1 | pk_2 |
+-----------+---------+ +---------+---------------+ +---------------+------+------+
| admin     |       1 | |       1 |             0 | |             2 |    1 |    1 |
| user1     |       2 | |       2 |             1 | |             2 |    1 |    2 |
| user2     |       3 | |       2 |             2 | |             3 |    1 |    3 |
| user3     |       4 | |       2 |             3 | |             4 |    2 |    1 |
|           |         | |       2 |             4 | |             3 |    2 |    2 |
|           |         | |       3 |             1 | |             1 |    2 |    3 |
|           |         | |       3 |             2 | |             1 |    3 |    1 |
|           |         | |       4 |             2 | |             5 |    3 |    2 |
|           |         | |       4 |             3 | |             4 |    3 |    3 |
|           |         | |       4 |             4 | |             2 |    4 |    1 |
|           |         | |         |               | |             3 |    4 |    2 |
|           |         | |         |               | |             3 |    4 |    3 |
+-----------+---------+ +---------+---------------+ +---------------+------+------+

为了提高性能,您需要将permission_id添加到用于搜索受控表的任何索引。这将允许您在搜索其余列时加入索引的权限。您应该查看执行计划以获取有关索引的特定详细信息。