首页 > 解决方案 > SQL Server 行级安全错误消息 33504

问题描述

对于这种情况,如果我们只是按照微软的例子。但是我想更改安全策略以添加一个块谓词:

CREATE SECURITY POLICY [dbo].[SalesFilter]
    ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep) ON dbo.Sales,
    ADD BLOCK PREDICATE Security.fn_securitypredicate(SalesRep) ON dbo.Sales AFTER INSERT
WITH (STATE = ON);  

当我发出测试时:

EXECUTE AS USER = 'Sales2';
INSERT INTO Sales VALUES (99, 'Sales1', 'Wiper', 2);
REVERT;

我正确收到错误消息 33504:

消息 33504,级别 16,状态 1,第 79 行尝试的操作失败,因为目标对象“.dbo.Sales”具有与此操作冲突的块谓词。如果对视图执行操作,则可能会在基础表上强制执行块谓词。修改操作以仅针对块谓词允许的行。该语句已终止。

我遇到的问题是错误消息没有提供失败的操作:插入、更新或删除。我什至可以接受“AFTER|BEFORE”部分,但该信息不可用,开箱即用。

如果我有一个更大的流程,可能会使用类似实体框架的 ORM 来插入、更新和/或删除销售记录,以维护订单的销售记录。有没有办法确定尝试了哪些操作,但被阻止了?

标签: sqlsql-serverentity-frameworkrow-level-security

解决方案


推荐阅读