插入时为 RLS 过滤的用户抛出 DbUpdateConcurrency 异常
DbUpdateConcurrency Exception Thrown for RLS Filtered User on Insert
我 运行 遇到一个问题,即由 RLS 强制执行的用户可以执行所有操作,除了插入新记录并且他们收到 DbUpdateConcurrencyException。
如果用户属于未被 RLS 过滤的组,则不会出现任何问题。这可以通过将自己移动到成功过滤的数据库角色来复制,但我无法将新记录添加到 table.
这是我的 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)
有什么想法吗?
搜索 SO 后,我发现这是一个 table 触发器未返回 scope_identity 导致的问题。
我刚刚将它添加到触发器的末尾以使其工作。仍然需要更改完整触发器以接受多行插入,但这是对我发布的问题的具体答案。
SELECT RouteID
FROM tblPairings
WHERE @@ROWCOUNT > 0 AND RouteID = SCOPE_IDENTITY();
回答以防其他人遇到此问题,我希望这能为他们节省一些时间!
我 运行 遇到一个问题,即由 RLS 强制执行的用户可以执行所有操作,除了插入新记录并且他们收到 DbUpdateConcurrencyException。
如果用户属于未被 RLS 过滤的组,则不会出现任何问题。这可以通过将自己移动到成功过滤的数据库角色来复制,但我无法将新记录添加到 table.
这是我的 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)
有什么想法吗?
搜索 SO 后,我发现这是一个 table 触发器未返回 scope_identity 导致的问题。
我刚刚将它添加到触发器的末尾以使其工作。仍然需要更改完整触发器以接受多行插入,但这是对我发布的问题的具体答案。
SELECT RouteID
FROM tblPairings
WHERE @@ROWCOUNT > 0 AND RouteID = SCOPE_IDENTITY();
回答以防其他人遇到此问题,我希望这能为他们节省一些时间!