2008-11-17 58 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表中使用教練和俱樂部牌桌(強制每個教練執行一個俱樂部規則),並在外部強制執行一個每個俱樂部教練規則。