行级安全性未按预期工作
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.
我需要限制对属于 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.