我在数据库中有两个实体,它们以父/子关系运行。
- 父表中的记录包含总量
- 子表中的记录总和必须小于/等于父总数
我有两个触发器
- 父表触发器检查更改不违反基于子值的约束
- 子表触发器检查更改是否违反基于父值的约束
业务应用程序允许用户同时更新两者。例如,我可以添加父总计,并在同一个表单提交中添加子行项目。或者我可以在同一笔交易中增加/减少现有数量的双方。
当用户想要将父级归零并将其所有子级归零时,就会出现问题。事务首先尝试将触发违规的父级归零,然后回滚事务。
所以你可能会说只是颠倒顺序。但是,如果我尝试在不先插入父项的情况下插入子项,那么在用户创建新记录的情况下,我也会违反另一个触发器。
我正在寻找的是是否有与延迟触发器等效的东西(我认为没有)。我也可以完全删除触发器,在 SP 中执行规则,但这是最好的选择吗?我很犹豫是否让表格像那样打开而不检查数据。
编辑 - 添加触发器示例
列名不准确,但逻辑与我使用的相同。
CREATE TRIGGER trg_child ON tbl_child
AFTER UPDATE,INSERT AS
BEGIN
IF EXISTS (SELECT PARENT_ID,ParentQty FROM (SELECT PARENT_ID, SUM(QTY) AS ChildQty FROM INSERTED GROUP BY PARENT_ID)
JOIN tbl_parent WHERE ChildQTY>ParentQty)
BEGIN
RAISERROR('Child quantities exceed parent',16,1)
ROLLBACK TRANSACTION
END
ELSE
END