【问题标题】:DbUpdateConcurrency Exception Thrown for RLS Filtered User on Insert插入时为 RLS 筛选器用户引发 DbUpdateConcurrencyException
【发布时间】:2021-11-30 11:45:07
【问题描述】:

我遇到了一个问题,即 RLS 强制执行的用户可以执行除插入新记录之外的所有操作,并且他们会收到 DbUpdateConcurrencyException。

如果用户属于未被 RLS 过滤的组,则不会出现问题。这可以通过将自己移动到成功过滤的 db 角色来复制,但我无法向表中添加新记录。

这是我的 TVF:

ALTER FUNCTION [RLS].[tvf_AssignmentsSecurityPredicate](@RlsArea INT, @BrandID SMALLINT, @ASM INT)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS tvf_securityPredicate_result
            FROM RLS.AssignmentsRLS AS rls
            WHERE (rls.Email = SUSER_SNAME() AND
            (rls.AreaID = @RlsArea OR rls.BrandID = @BrandID OR rls.ASM = @ASM))
            OR (IS_MEMBER('all_admin') = 1
            OR IS_MEMBER('all_leadership') = 1
            OR IS_MEMBER('concierge') = 1
            OR IS_MEMBER('db_owner') = 1);

以及安全政策:

ALTER SECURITY POLICY [RLS].[SecurityPolicies] 
ADD FILTER PREDICATE [RLS].[tvf_AssignmentsSecurityPredicate]([RlsArea],[BrandID],[Retailer_ASM]) ON [dbo].[tblPairings]
WITH (STATE = ON, SCHEMABINDING = ON)

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    在 SO 上搜索后,我发现这是一个表触发器未返回 scope_identity 导致问题。

    我只是将它添加到触发器的末尾以使其工作。仍然需要更改完整触发器以接受多行插入,但这是我发布的问题的具体答案。

    SELECT RouteID
    FROM tblPairings
    WHERE @@ROWCOUNT > 0 AND RouteID = SCOPE_IDENTITY();
    

    回答以防其他人遇到此问题,我希望这可以节省他们一些时间!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2020-06-28
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多