2008-11-17 31 views
1

我有两张桌子。俱乐部和教练。 它们之间是0,1 - 0,1的关系(教练可以有零个或一个俱乐部,俱乐部可以有零个或一个教练)。 当我想改变俱乐部的教练时,我必须更新俱乐部桌。所以我必须改变该俱乐部的idCoach。让我们考虑一个新的教练(新分配的俱乐部教练)已经是其他俱乐部的教练。我必须设置为该俱乐部的空场idCoach,因为他的教练将被分配到另一个俱乐部。 另外,如果我想改变教练的俱乐部已经有教练,那么我必须将该教练的idClub(在教练表中)设置为Null。MS SQL触发器更新调用死锁?

上面给出的所有,也适用于当我想改变某个教练的俱乐部。 (必须设置为特定教练的前一个俱乐部的空idCoach场,并且必须设置为新俱乐部的空idCoach)。

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

我想用触发器解决这个问题。我想我必须在俱乐部桌上有3个触发器(用于插入,更新和删除),还有3个在教练桌上。

在更新触发器(例如俱乐部)中,我必须更新教练表,这将再次触发俱乐部更新(因为它的身体上必须更新俱乐部表),并且该触发器将更新教练和触发等等。所以我会死锁。

如何解决这个问题?

这是有史以来第一次我和触发器工作,提前很抱歉,对于一个简单的事情,这个大的解释。

干杯!

回答

2

我认为这可能不是触发器,这是非常难以调试的适当使用,并经常通过惊讶,他们不支持单记录操作如你所期望的方式的人。把它分解成简单的SQL语句,然后用它来包装一个事务。

+0

这就是为什么新开发人员不应该被允许创建触发器的原因。我觉得奇怪的是,人们会认为它一次只能记录一条记录,但后来我是一名数据库专家,并且我认为这是一套。从未想到他们不会成套工作。 – HLGEM 2008-12-02 16:35:04

0

我建议避免触发器,如果​​可以的话。如果您必须尝试使用​​而不是触发器而不是常规触发器。在实际修改任何数据之前,区别并不在于触发器触发。随着中说我觉得你的好得多使用存储过程,并看看是否你

另一个建议是,如果你能代替模拟这种作为关联的实体。我认为俱乐部的教练也必须是俱乐部的教练。所以你可以做的是创建一个CoachAssignment表,现在你只需要维护这个记录。如果你需要一个教练来属于多个俱乐部,那么这个模型就在你身边。

虽这么说,你可以使用。如果更新(字段名)语法只更新你真正需要的表。如果您需要停止递归触发器可以防止这种通过检查TRIGGER_NESTLEVEL()

2

是否确定有3台,可容纳的关系?我认为这将是一个简单的方法。

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

希望有所帮助。

0

我同意shahkalpesh - 你的设计应该包括教练桌,俱乐部桌,第三张桌子(ClubCoach?)来存储关系。那么你所要做的就是强制规定教练不能分配给多个俱乐部(反之亦然)。

或者,您可以在Coach表中使用教练和俱乐部牌桌(强制每个教练执行一个俱乐部规则),并在外部强制执行一个每个俱乐部教练规则。