Announcement

Collapse
No announcement yet.

Trigger Zyklen vermeiden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Trigger Zyklen vermeiden

    Hallo!

    Ich möchte gerne 2 Tabellen in verschiedenen Datenbanken Synchron halten, dazu hätte ich mir überlegt das ich die 2 Tabellen mit einem Trigger ausstatte, die die Ausgeführte Operation an die zweite Tabelle weiterleitet.

    Gibt es irgendwie einen "üblichen" weg sowas zu lösen?
    Ich hätte gedacht bei Insert kann ich z.b abfragen ob die ID schon vorhanden ist, aber bei updates wirds da schon schwieriger. Da leite ich das update weiter und das würde ja meines erachtens dan zu einem Zyklus führen?!


    danke
    Flo

  • #2
    Ich hätte gedacht bei Insert kann ich z.b abfragen ob die ID schon vorhanden ist, aber bei updates wirds da schon schwieriger.
    Man würde üblicherweise eine weiteren generierten Schlüssel jenseits des PKs der Tabelle hinzufügen der sich bei jedem update mit ändert. In diesem Fall sollte das kein simples Inkrement sein sondern ein zufälliger Wert (Uniqueidentifier). Bei einem simplen Inkrement könntest du Probleme bekommen wenn in beiden Tabellen gleichzeitig der gleiche Datensatz geändert wird.

    Comment


    • #3
      Einen Zyklus könnte man vermeiden, indem man das per TRIGGER_NESTLEVEL kontrolliert.
      Hier eine einfache Variante unter der Annahme, dass die Tabellen t1 und t2 heissen und einen eindeutigen Schlüssel
      namens ID haben, der nicht als IDENTITY definiert ist:

      Trigger auf Tabelle t1:

      CREATE TRIGGER trig1 ON t1 AFTER INSERT, DELETE, UPDATE AS
      BEGIN

      if (SELECT TRIGGER_NESTLEVEL()) > 1 return

      delete t2 where t2.id in (select id from deleted)
      insert into t2 select * from inserted

      END
      GO
      und hier der Trigger auf t2:

      CREATE TRIGGER trig2 ON t2 AFTER INSERT, DELETE, UPDATE AS
      BEGIN

      if (SELECT TRIGGER_NESTLEVEL()) > 1 return

      delete t1 where t1.id in (select id from deleted)
      insert into t1 select * from inserted

      END
      GO
      das Ganze funktioniert etwa so:
      zuerst alle Records in der zweiten Tabelle löschen, die in der ersten Tabelle gelöscht oder geändert wurden.
      Dann (falls Insert oder Update) die aktuellen Records in der zweiten Tabelle wieder einfügen.

      Man muss aufpassen, dass das auch funktioniert, wenn man zB. ein "update t1 set feld1 = wert1 where id < 100" machen würde, dann müsste der Trigger u.U. ja mehrere Records auf einmal berücksichtigen!

      bye,
      Helmut

      Comment


      • #4
        Danke!
        Das funktioniert eigentlich genau so wie ich es brauche.

        nur bei verknüpfungstabellen komme ich mit dem
        delete t1 where t1.id in (select id from deleted)
        nicht klar da der schlüssel aus 2 Feldern besteht
        gibts irgendwas wie
        delete t1 where (t1.id,t1.id2) in (select id,id2 from deleted)

        Comment


        • #5
          Einfach die beteiligten Spalten zu einer konkatenieren so das man keine 2 Spalten hat. Also sozusagen , durch + (oder anderem Operator je nach Datentyp) ersetzen. Ob das dann noch performant ist musst du ausprobieren.

          Comment

          Working...
          X