我在存储过程中有一个sql server update语句,它在执行过程中违反了一个约束,但是一旦整个update语句完成,该约束就有效。
声明如下:

UPDATE SomeTable SET FieldA = 1 WHERE FieldB = @SomeFieldBValue;

sometable表中的行与引用父行的子行形成层次关系。该约束确保父行不能将fielda设置为非空值,除非所有子行都将fielda设置为非空值。
例如,假设sometable包含以下数据:
Id | ParentId | FieldA | FieldB
-- | -------- | ------ | ------
1  | NULL     | NULL   | 123
2  | 1        | NULL   | 123

现在,当UPDATE语句执行时,它会因约束冲突而失败,因为第1行不允许将FIELDA设置为非空值,除非其所有子级都将FIELDA设置为非空值。
暂时禁用约束不是一个选项,因为用户无权执行此操作。

最佳答案

像这样的扳机能完成同样的任务吗?

create trigger ...
if exists (
    select i.Id
    from
        inserted i left outer join inserted i2
            on i2.ParentId = i.Id
    group by i.Id
    having not (count(i.FieldA) = 0 or count(i2.FieldA) = count(i2.Id))
) rollback;

10-05 20:13