2016-07-22 13 views
2

Ich habe eine Tabelle namens ClientInfo, die persönliche Informationen eines Clients speichert und eine andere Tabelle namens EmergencyContactInfo, die ihre Notfallkontaktinformationen speichert. Im Moment habe ich einen Update-Trigger in meiner ClientInfo-Tabelle, der einen einzelnen Datensatz in eine dritte Tabelle namens ClientLog einfügt, wenn sich eine ihrer persönlichen Informationen ändert. Ich möchte auch einen ClientLog-Datensatz erstellen, wenn sich die Notfallkontaktinformationen des Kunden ändern.Wie verhindern Sie, dass zwei Trigger auf separaten Tabellen gleichzeitig ausgelöst werden?

Das Problem ist, dass der Benutzer sowohl persönlich als ein Client-Informationen und Kontaktinformationen ihres Notfall mit einem einzigen speichern von meiner Homepage ändern. Wenn ich einen Aktualisierungstrigger auf meine EmergencyContact-Tabelle lege, werden beide Trigger ausgelöst und die ClientLog-Tabelle fügt zwei neue Datensätze ein, wenn ich nur einen möchte.

Von dem, was ich verstehe, gibt es nicht so etwas wie ein Update-Trigger, die über mehrere Tabellen erstreckt. Was wäre ein alternativer Ansatz, den ich verwenden könnte, der einen einzigen Datensatz einfügen würde, wenn sich sowohl die persönlichen Informationen des Kunden als auch seine Notfallkontaktinformationen ändern?

+0

Erkalten Sie einfach die Überwachung in die Prozedur, die das Update durchführt, anstatt einen Trigger zu verwenden? –

+1

"Wenn ich einen Aktualisierungstrigger in meine EmergencyContact-Tabelle lege, werden beide Trigger ausgelöst und die ClientLog-Tabelle fügt zwei neue Datensätze ein, wenn ich nur einen möchte." Warum würden Sie das wollen? Es erscheint mir * völlig * sinnvoll, zwei Platten zu schreiben. Was schreiben Sie in ClientLog? – aquinas

+0

Mögliche Option mit Context_Info. https://stackoverflow.com/questions/174600/is-there-a-way-to-disable-a-sql-server-trigger-for-just-a-particular-scope-of-ex –

Antwort

1

Ihr Verständnis ist richtig, dass ein Trigger nicht mehrere Tabellen umfassen kann.

Es ist auch nicht so etwas wie ein Auslöser von Brennen zu verhindern.

Was Sie tun können, ist die Logik in den Trigger umfassen, die es von etwas zu tun verhindert, wenn bestimmte Bedingungen erfüllt sind.

Jetzt weiß ich nicht, was Sie in Ihre Protokolltabelle schreiben, und welche Logik Sie erzwingen möchten, aber ein Beispiel wäre, wenn der Trigger ausgelöst wird, wenn bereits ein Protokolleintrag vorhanden ist (Zeile in die Protokolltabelle) für den gleichen Client in den vergangenen x Stunden, dann fügen Sie einfach keine neue Zeile in die Protokolltabelle ein.

Sie können sogar mehrere Zeilen einfügen/aktualisieren mit einer OUTER JOIN in der Protokolltabelle oder eine WHERE NOT EXISTS() Klausel.

Aber im Grunde, was ich sage ist, lassen Sie beide Auslöser Feuer, und in beiden Triggern überprüfen, ob eine Bedingung wahr/falsch ist vor dem Schreiben in die Log-Tabelle. Ansonsten nichts tun.

+0

Was ist mit "DISABLE TRIGGER"? Ich verstehe die eigentliche Frage auch nicht, aber ist diese Aussage nicht unwahr? – shawnt00

+0

Ich glaube nicht, "DISABLE TRIGGER" ist das, was der OP im Sinn hatte, als er sagte "Verhindere einen Auslöser vom Feuern". Das erste ist universell, das zweite, wie ich es gelesen habe, ist bedingt. –

+0

Als ich die Frage gelesen habe, wurde mir klar, dass es nicht wirklich eine Lösung für das Problem von OP war. Ich verstehe Ihren Standpunkt, obwohl ich nicht sicher bin, ob jeder es so lesen wird. – shawnt00

0

Sie machen dies unnötig schwierig und fehleranfällig.

Wenn jeder Datentabelle eine separate Protokolltabelle hat und seinen eigenen Trigger, können Sie das gesamte Problem ignorieren und lassen Sie sie einfach funktionieren wie sie sollten sind.

Wenn Sie das Protokoll Informationen zusammen sehen möchten, können Sie einen JOIN auf den beiden Tabellen verwenden, wenn Sie die Daten anzuzeigen.

+0

Während ich zustimme, diese Trigger frei laufen zu lassen und dann einen Join (wahrscheinlich in einer Ansicht) zu verwenden, adressiere nicht die nicht-triviale technische Herausforderung, was diese Join-Bedingung sein könnte. –

+0

Ich nahm an, dass die Tabellen pk/fk haben würde.Wenn nicht, müssten sie repariert werden. –

+0

Ich sage, dass es wahrscheinlich darüber hinaus geht, um herauszufinden, welche Zeilen in den Log-Tabellen "verbunden" werden sollten, um ein Update darzustellen, um falsche Duplikate zu vermeiden. –