我正在尝试在 SQL Server 2016 中实现行级安全性。
问题是,我可以有多个用户应该对给定的行具有读取权限,并且当我在谓词中编写一些复杂的条件时,性能变得非常非常非常糟糕。
我试图将所有用户名保留在表的一列和谓词中以通过它们搜索SYSTEM_USER
with% LIKE %
但性能很低。
我的受控表中用户名列中一行的值示例:
domain\john.wick;domain\red.eagle;domain\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];