Sql 一行多用户的行级安全性

Sql 一行多用户的行级安全性,sql,sql-server,row-level-security,security-policy,Sql,Sql Server,Row Level Security,Security Policy,我正在尝试在SQL Server 2016中实现行级安全性 问题是,我可以让多个用户对给定的行具有读取权限,当我在谓词中写入一些复杂条件时,性能会变得非常糟糕 我试图将所有用户名保留在表的一列和谓词中,以便使用%LIKE%搜索SYSTEM_用户,但性能很低 我的受控表中一行的“用户名”列中的值示例: 域\john.wick;域\ red.eagle;域\spartak.something 以下是我的功能: CREATE FUNCTION fn_securitypredicate(@Usernam

我正在尝试在SQL Server 2016中实现行级安全性

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

我试图将所有用户名保留在表的一列和谓词中,以便使用%LIKE%搜索SYSTEM_用户,但性能很低

我的受控表中一行的“用户名”列中的值示例:

域\john.wick;域\ red.eagle;域\spartak.something

以下是我的功能:

CREATE FUNCTION fn_securitypredicate(@Usernames AS nvarchar(4000))  
  RETURNS TABLE  
WITH SCHEMABINDING  
AS  
  RETURN
  SELECT 1 as Result
  WHERE @Usernames LIKE '%' + SYSTEM_USER + '%'
执行时间从2秒变为50秒。任何改进建议

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

这是我为前一个团队提出的解决方案

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

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 |
+-----------+---------+ +---------+---------------+ +---------------+------+------+

为了提高性能,您需要将权限id添加到用于搜索受控表的任何索引中。这将允许您在搜索其余列时加入对索引的权限。您应该查看执行计划,了解索引的具体细节。

1。请在这里张贴您的代码2。使用%…%可以实现什么性能?为什么不搜索精确匹配?我添加了更多细节和代码。好吧,我的问题仍然是,为什么不使用精确匹配?其中@Usernames=SYSTEM\u USER'因为每行有多个用户,我不能使用精确匹配。。。。否则,这将是最理想的解决方案。我举的例子是一排;usernames列中每行的分隔值如果要加快代码的速度,应该规范化表。当行中只有一个用户时,可以使用索引。当您与多个用户一起使用行时,例如%…%,没有索引可以帮助您。你能将你的用户分组到一个角色/窗口组中,并且每行有一个角色/组吗?是的,但这意味着对于受控表中的每一行,在其他表中都有一个select。这就像做内部连接。这太慢了。在我使用的存储过程中,有很多聚合,如果过程的正常执行时间是2秒,按照您建议的方式,它变成了3分50秒。。。