2016-08-01 7 views
0

Ich verwende Trigger, um zwei identische Tabellen in einer einzigen Datenbank synchron zu halten. Einer ist für ein internes proprietäres System, der andere wird verwendet, um eine Teilmenge von Daten nach außen zu bringen. Ich kann nicht die gleiche Tabelle für beide verwenden.SQL Server 2 Tabelle Sync Rekursion

Ich brauche Updates, fügt, löscht in einer der Tabellen, die auf die andere angewendet werden.

Bisher verwende ich Trigger für beide Tabellen anstelle einer geplanten gespeicherten Prozedur, weil ich sofortige Updates wollte. Das Problem besteht darin, dass eine Aktualisierung der Tabelle A den Auslöser auslöst, um die Tabelle B zu aktualisieren, die einen Auslöser auslöst, um die Tabelle A zu aktualisieren, die den Auslöser für die Tabelle B ... auslöst.

Was ist der beste Weg, um die Rekursion zu stoppen?

Eine Möglichkeit ist es, die Daten zuerst zu überprüfen, um zu sehen, ob es anders ist, so etwas wie diese:

 SELECT @cempno = inserted.cempno FROM inserted 

     SELECT @count = COUNT(*) 
      FROM jcempy j INNER JOIN zhhjcempy z ON j.cempno = z.cempno AND j.cempno = @cempno 
      WHERE (j.ccostcode <> z.ccostcode) 
      OR (j.cimearnreg <> z.cimearnreg) 
      OR (j.cimearnot <> z.cimearnot) 
      OR (j.cimearndt <> z.cimearndt) 
      OR (j.cimearnl1 <> z.cimearnl1) 

     IF @count = 1 
     BEGIN 
      -- Update the record 
     END 

Eine weitere Möglichkeit, eine dritte Tabelle zu verwenden, den Statusflags sein könnte hält, welche Tabelle zeigen zunächst die Eingeweihten update, aber ich habe das Gefühl, dass das ein Problem sein wird, wenn ich 100 Benutzer habe, die auf das System hämmern.

Irgendwelche Ideen oder Kommentare, welche Art von Leistungseinbußen die Datenüberprüfung erleiden wird?

Danke!

+0

Können Sie eine Tabelle tatsächlich eine [aktualisierbare Ansicht] (https://msdn.microsoft.com/en-nz/library/ms187956.aspx#Anchor_3) auf die andere zeigen? – Blorgbeard

+0

@Blorgbeard Leider sind hier keine Drittanbieter-Tools enthalten. Interessante Idee, daran habe ich nicht gedacht. – NelsonH

+0

Sie benötigen ein Redesign, das keine Trigger verwendet. Es gibt ein altes Sprichwort: "Ein Mann, der eine Uhr hat, weiß, wie spät es ist, ein Mann, der zwei hat, ist nie sicher." – JVC

Antwort

0

Wenn Sie Trigger nicht vermeiden können, schauen Sie sich @@NESTLEVEL in Ihrem Trigger an.

Es sollte immer die gleiche Nummer sein. Wenn die Nummer größer ist, tun Sie einfach nichts.

+0

Das könnte funktionieren, aber woher weiß ich, was der @@ NESTLEVEL-Wert sein soll? Ich erhalte ein konsistentes Testergebnis - wird das immer dasselbe sein? Danke für die Antwort! – NelsonH

+0

Wenn Sie Aktualisierungen/Löschungen/Einfügungen vornehmen, sollte es "1" sein. Wenn Sie für diese Updates eine Mischung aus Verfahren und direkten Updates verwenden, kann die tat-Nummer variieren. Bessere loszuwerden Trigger mit Ansichten oder Synonyme und haben alle Daten in nur einer Tabelle. –

+0

der Wert war eigentlich 3. Ich machte es mit TRIGGER_NESTLEVEL() arbeiten, Blick auf Objekt-ID des Gegners Trigger. Ich verstehe, dass die Kommentare keine Trigger verwenden, aber ich habe keine Möglichkeit für ein Redesign. Von einem meiner Verkäufer zurückgemeldet und Synonyme/aktualisierbare Ansichten werden absolut nicht funktionieren. Muss Tabellen sein. Vielen Dank für die Antwort, geschätzt. – NelsonH