azure-sql-database - 插入时为 RLS 过滤用户引发 DbUpdateConcurrency 异常
问题描述
我遇到了一个问题,即 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)
有任何想法吗?
解决方案
在 SO 上搜索后,我发现这是一个表触发器没有返回 scope_identity 导致问题。
我只是将它添加到触发器的末尾以使其工作。仍然需要更改完整触发器以接受多行插入,但这是我发布的问题的具体答案。
SELECT RouteID
FROM tblPairings
WHERE @@ROWCOUNT > 0 AND RouteID = SCOPE_IDENTITY();
回答以防其他人遇到此问题,我希望它可以节省他们一些时间!
推荐阅读
- javascript - 如何创建到 Telit BLE 模块的终端 I/O 连接?
- angular - 库内单元测试组件时生成的测试失败
- c# - 循环遍历未知对象
- mysql - 来自命令行的注入证明 SQL 语句
- iis - url重写指向外部url后如何捕获出站网络流量
- c# - 使用只读结构作为字典键
- django - Django 在 2 个不同应用程序之间使用 ManyToManyField
- twincat - 仅运行 TwinCAT 3 ADS(无 XAR)
- python - 如何修复 Linux 中的“ImportError: No module named ...”?
- java - Json 反序列化后的 NullPointerExcetion