我需要限制对属于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
答案 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。