我在存储过程中有一个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;