行级安全性未按预期工作

时间:2018-11-04 14:42:04

标签: azure-sql-database row-level-security

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

我可能做错了什么?

下面的那个甚至不会编译。我也尝试了Case语句,它可以编译,但是不过滤就返回所有内容。

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

1 个答案:

答案 0 :(得分:0)

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

要记住的是,安全功能是一个表值功能,因此您必须以这种方式进行编码。还有更多示例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

这将限制应用于除sysadmins之外的所有人,我已将其添加为安全条件。我已经按照要点发布了完整的脚本,您可以查看here