首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS SQL触发器更新调用死锁?

MS SQL触发器更新调用死锁?
EN

Stack Overflow用户
提问于 2008-11-17 23:57:58
回答 4查看 3K关注 0票数 1

我有两张桌子。俱乐部和教练。他们之间是0,1 - 0,1的关系(教练可以有零个或一个俱乐部。俱乐部可以没有教练,也可以有一个教练)。当我想要更换给定俱乐部的教练时,我必须更新俱乐部表。所以我得换掉那个俱乐部的idCoach。让我们考虑一位新教练(给定俱乐部的新教练)已经是其他俱乐部的教练了。我必须将那个俱乐部的idCoach设置为空场,因为他的教练将被分配到另一个俱乐部。另外,如果我想要更换教练的俱乐部已经有了教练,那么我必须将该教练的idClub (在coach表中)设置为空。

以上所有内容,也适用于当我想更换某个教练的俱乐部时。(必须设置为给定教练的前一个俱乐部的空idCoach字段,并且必须设置为新俱乐部的空idCoach )。

当我在Club或Coach表中插入新记录,或者删除现有记录时,可能会出现同样的问题(在insert、update和delete中,我必须注意相应的引用并取消它们的链接)。

我想用触发器来解决这个问题。我猜我必须在Club表中有3个触发器(用于插入、更新和删除),在Coach表中还有3个触发器。

在更新触发器中(例如在Club中),我必须更新Coach表,这将再次触发Club中的更新(因为在它的主体中,它必须更新Club表),且触发器将更新Coach和触发器,依此类推。所以我会有一个死锁。

如何解决这个问题?

这是我第一次使用触发器,非常抱歉,对于一个简单的事情做了这么大的解释。

干杯!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-18 00:09:31

我建议这可能不适合使用触发器,因为触发器很难调试,而且经常让人感到惊讶,因为它们不支持单记录操作,这与您预期的一样。将其分解为简单的SQL语句,并围绕它包装一个事务。

票数 2
EN

Stack Overflow用户

发布于 2008-11-18 00:44:28

是否可以有第三个表,它可以容纳关系?我认为这将是一种简单的工作方法。

如果教练从俱乐部辞职,只需从新表中删除记录即可。插入教练加入新俱乐部的记录。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2008-11-18 00:22:56

我建议尽可能避免触发器。如果必须尝试使用Instead of触发器而不是普通触发器。不同之处在于,instead of触发器在实际修改任何数据之前触发。话虽如此,我认为您最好使用存储过程,并查看您是否

另一个建议是,您是否可以将其建模为关联实体。我假设俱乐部的教练也必须是俱乐部的教练。所以你可以做的就是创建一个CoachAssignment表,现在你只需要维护这一条记录。如果你曾经需要一个教练属于多个俱乐部,这个模型就是为你准备的。

也就是说,您可以使用If Update(FieldName)语法来只更新您实际需要的表。如果需要停止递归触发器,可以通过检查TRIGGER_NESTLEVEL()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/297412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档