我的桌子:
TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
所以 TableC 中的项是 TableB 的子项,TableB 中的项是 TableA 的子项。反之亦然 - TableA 中的项是 TableB 的父项,TableB 中的项是 TableC 的父项。
我想控制父项的状态......例如,我们有这些数据:
TableA (id, state):
1, 40
TableB (id, tableAId, state):
1, 1, 40
2, 1, 60
TableC (id, tableBId, state):
1, 1, 40
2, 1, 50
3, 2, 60
4, 2, 70
父状态应该始终是他的孩子的最小状态。因此,如果我们现在像这样更新 TableC:
update TableC set state = 50 where Id = 1;
我的触发器应该自动更新 TableB(设置状态 = 50,其中 id = 1),然后也更新 TableA(设置状态 = 50,其中 id = 1)
我想使用触发器(在 TableA、TableB、TableC 上的 AFTER UPDATE、INSERT、DELETE )来执行此操作,以便在每个操作之后执行此步骤:
- 获取父母ID
- 从当前父母的所有孩子中找到最小的状态
- 如果所有子节点的最小状态大于父节点的状态,则更新父节点
如何避免“变异表错误”?在这个例子中使用自治事务是否节省?我看到了一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止出现此错误?
谢谢
编辑:感谢所有伟大的答案!
最后,我使用了触发器(感谢 Vincent Malgrat,他指出了 Tom Kyte 的文章)。
编辑:在真正的结局中,我使用了存储过程并删除了触发器:)