行级安全性未按预期工作

Row Level Security not working as expected

我需要限制对属于 RegionID 的行的访问 1. 不确定如何创建谓词函数来满足谓词函数中的这个条件?我什至尝试将 0 和 1 硬编码为 return 语句,但它仍然是 return 的所有内容,没有任何过滤。

我可能做错了什么?

下面的甚至无法编译。我也尝试了 Case 语句,它编译了但是 return 一切都没有过滤。

CREATE FUNCTION RLS.fn_RegionLimit(@RegionID int)
RETURNS table
with schemabinding
AS
   IF @RegionID=1
      RETURN 1
   ELSE
      RETURN 2

create security policy rls.PatientsSecurityPolicy
ADD Filter PREDICATE RLS.fn_RegionLimit(RegionID) on dbo.TestOrder
WITH (STATE=ON)

Select * from dbo.TestOrder

这是否仅适用于某些用户?您不想仅将其应用于某些用户或角色吗?这听起来有点危险。

请记住,安全函数是一个 table 值函数,因此您必须以这种方式对其进行编码。还有几个例子here.

我已经基于这个安全功能编写了一个示例:

CREATE FUNCTION dbo.fn_securitypredicate( @regionId INT )
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN

    SELECT 1 AS fn_securitypredicate_result
    WHERE @regionId = 1
       OR IS_SRVROLEMEMBER( N'sysadmin' ) = 1;

GO

这将限制应用于除系统管理员之外的所有人,我已将其添加为安全条件。我已将完整的脚本作为要点发布,您可以查看 here.