【问题标题】:Row Level Security not working as expected行级安全性未按预期工作
【发布时间】:2019-04-08 01:54:05
【问题描述】:

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

我做错了什么?

下面的甚至无法编译。我也尝试了 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

【问题讨论】:

  • 只是想强调必须使用Select语句,用文字返回不起作用

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


【解决方案1】:

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

要记住的是,安全函数是一个表值函数,因此您必须以这种方式对其进行编码。还有几个例子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

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 2020-10-30
    • 2017-09-09
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多