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

时间:2008-11-17 23:57:58

标签: sql sql-server triggers

我有两张桌子。俱乐部和教练。 他们之间是0,1 - 0,1关系(教练可以有零或一个俱乐部。俱乐部可以有零或一个教练)。 当我想改变特定俱乐部的教练时,我必须更新俱乐部桌子。所以我必须改变那个俱乐部的idCoach。让我们考虑一个新教练(新指定的俱乐部教练)已经是其他俱乐部的教练了。我必须设置该俱乐部的Null field idCoach,因为他的教练将被分配到另一个俱乐部。 另外如果我想改变教练的俱乐部,已经有教练,那么我必须将那个教练的idClub(在Coach表中)设置为Null。

上面给出的所有内容,也适用于我想改变某个教练的俱乐部的时候。 (必须设置为给定教练的前一个俱乐部的Null idCoach字段,并且必须设置为新俱乐部的id.coach)。

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

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

在更新触发器中(例如在Club中)我必须更新Coach表,它将再次触发Club中的更新(因为它的主体必须更新Club表)并且该触发器将更新Coach和触发器等等。所以我会死锁。

如何解决这个问题?

这是我第一次使用触发器,所以提前抱歉,对于一个简单的事情的这个重要解释。

干杯!

4 个答案:

答案 0 :(得分:2)

我建议这可能不适合用于非常难以调试的触发器,并且通常会像他们预期的那样以不支持单记录操作的方式给人们带来惊喜。将其分解为简单的SQL语句,然后围绕它包装事务。

答案 1 :(得分:2)

拥有可以保持关系的第3张表是否可以?我认为这将是一种简单的工作方式。

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

希望有所帮助。

答案 2 :(得分:0)

如果可以的话,我建议避免使用触发器。如果您必须尝试使用​​而不是使用触发器而不是普通触发器。在实际修改任何数据之前,不同的是触发器触发。有了这个说我觉得你最好使用存储过程,并看看你是否

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

话虽如此,您可以使用If Update(FieldName)语法仅更新实际需要的表。如果您需要停止递归触发,可以通过检查TRIGGER_NESTLEVEL()

来阻止这种情况。

答案 3 :(得分:0)

我同意shahkalpesh - 你的设计应该包括一个Coach表,一个Club表,一个第三个表(ClubCoach?)来存储关系。那么你所要做的就是执行规则,在那里教练不能被分配到一个以上的俱乐部(反之亦然)。

或者,你可以只拥有教练和俱乐部表,在教练表中使用idClub(强制执行每个Coach规则),并在外部执行每个俱乐部规则。