MS SQL Trigger Update Anruf Dead Lock?

Ich habe zwei Tische. Club und Trainer Zwischen ihnen ist 0,1 – 0,1 Beziehung (Trainer kann null oder einen Club haben. Verein kann null oder einen Trainer haben). Wenn ich den Trainer des Clubs wechseln will, muss ich den Clubtisch aktualisieren. Also muss ich idCoach von diesem Club wechseln. Lets betrachten einen neuen Trainer (der neu zugewiesene Trainer des jeweiligen Vereins) ist bereits ein Trainer eines anderen Clubs. Ich muss auf Null Feld idCoach von diesem Verein gesetzt werden, weil sein Trainer wird einem anderen Verein zugeordnet werden. Auch wenn der Club, für den ich den Trainer wechseln möchte, bereits einen Trainer hat, dann muss ich den IdClub von diesem Trainer (in Coach Tisch) auf Null setzen.

Alle oben genannten gilt auch, wenn ich den Club des gewissen Trainers wechseln möchte. (muss auf Null idCoach Feld des vorherigen Clubs eines gegebenen Trainers gesetzt haben und muss auf null idCoach des neuen Clubs setzen).

Die gleichen Probleme können auftreten, wenn ich einen neuen Rekord in der Club- oder Coach-Tabelle einfügte oder wenn ich die vorhandene (in Insert, Update und Delete löschen), muss ich auf die entsprechenden referenceen achten und sie aufheben).

Ich möchte das mit Auslösern lösen. Ich glaube, ich müsste in der Clubtabelle 3 Trigger haben (für Einfügen, Aktualisieren und Löschen) und 3 weitere in Coach Tisch.

Im Update-Trigger (zB im Club) muss ich die Coach-Tabelle aktualisieren, die das Update im Club wieder auslösen wird (Ursache in seinem Körper muss es die Clubtabelle aktualisieren) und dieser Trigger wird den Coach aktualisieren und auslösen und so weiter. Also werde ich eine tote sperre haben

Wie kann man das lösen?

Dies ist das erste Mal, dass ich mit Auslösern arbeite, also sorry im Voraus, für diese große Erklärung einer einfachen Sache.

Prost!

Ich schlage vor, dass dies nicht eine angemessene Verwendung für Trigger sein kann, die sehr schwer zu debuggen sind, und oft überraschen Menschen durch die Art, wie sie nicht unterstützen Single-Record-Operationen, wie Sie es erwarten würden. Brechen Sie es in einfache SQL-statementen und wickeln Sie eine Transaktion um es stattdessen.

Ist es in Ordnung, einen dritten Tisch zu haben, der die Beziehungen behalten kann? Ich denke, das wird ein einfacher Ansatz sein, um mit zu arbeiten.

Löschen Sie einfach den Rekord von der neuen Tabelle, wenn der Trainer von einem Verein zurücktritt. Setzen Sie einen Rekord ein, für einen Trainer, der einem neuen Verein beitritt.

Ich hoffe, das hilft.

Ich empfehle, Auslöser zu vermeiden, wenn du kannst. Wenn Sie versuchen müssen, anstelle von Auslösern anstelle von normalen Auslösern zu verwenden. Der Unterschied ist statt der Auslösung von Feuer, bevor irgendwelche data tatsächlich geändert werden. Mit dem sagte, ich denke, Sie viel besser aus mit gespeicherten Prozeduren, und suchen, um zu sehen, wenn Sie

Ein weiterer Vorschlag ist, wenn man das stattdessen als assoziative Einheit modellieren könnte. Ich gehe davon aus, dass der Trainer des Vereins auch der Trainer des Vereins sein muss. Also, was Sie tun können, ist, eine CoachAssignment-Tabelle zu erstellen, jetzt müssen Sie nur diesen datasatz beibehalten. Wenn du jemals einen Trainer brauchst, um zu mehreren Clubs zu gehören, ist das Model für dich da.

Mit diesem sagte, können Sie die If Update (FieldName) -Syntax verwenden, um nur die Tabellen zu aktualisieren, die Sie tatsächlich benötigen. Wenn Sie einen rekursiven Auslöser stoppen müssen, können Sie dies verhindern, indem Sie TRIGGER_NESTLEVEL ()

Ich stimme mit shahkalpesh – dein Design sollte einen Coach Tisch, einen Club Tisch, eine dritte Tabelle (ClubCoach?), Um die Beziehungen zu speichern. Dann müssen Sie nur noch die Regel erzwingen, wo ein Trainer nicht mehr als einem Club (und umgekehrt) extern zugewiesen werden kann.

Alternativ könntest du nur Coach- und Club-Tische haben, mit idClub in der Coach-Tafel (Durchsetzung der Club-Co-Coach-Regel) und erzwinge die Coach per Club-Regel extern.