Announcement

Collapse
No announcement yet.

rekursiver/geschachtelter Trigger

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

  • rekursiver/geschachtelter Trigger

    Hallo Zusammen,

    ich habe da ein Problem ! ! !
    GESCHACHTELTE bzw. REKURSIVE TRIGGER unter ORACLE.

    Wir arbeiten relativ viel mit Triggern. Nun ist es das erste mal, dass ich leider das Pech hatte einen GESCHACHTELTEN TRIGGER zu erstellen.
    Dieser Trigger führt ein Update in einer anderen Tabelle aus, auf der ebenfalls ein Update-Trigger sitzt und der in die Ursprungstabelle zurückschreibt.
    Resultat: Programm hängt sich auf

    Lösung:

    Beim SQL-Server gibt es einen einfachen Befehlt - "rekursive Trigger deaktivieren"! GIBT es so etwas bei ORACLE (Vers. 9.20) auch?

    Vielen Dank für Eure Rückantworten!
    Georg
    6
    JA
    83,33%
    5
    NEIN
    0,00%
    0
    Nur bedingt
    16,67%
    1

    The poll is expired.


  • #2
    Originally posted by GPF View Post
    Hallo Zusammen,

    ich habe da ein Problem ! ! !
    GESCHACHTELTE bzw. REKURSIVE TRIGGER unter ORACLE.

    Wir arbeiten relativ viel mit Triggern. Nun ist es das erste mal, dass ich leider das Pech hatte einen GESCHACHTELTEN TRIGGER zu erstellen.
    Dieser Trigger führt ein Update in einer anderen Tabelle aus, auf der ebenfalls ein Update-Trigger sitzt und der in die Ursprungstabelle zurückschreibt.
    Resultat: Programm hängt sich auf

    Lösung:

    Beim SQL-Server gibt es einen einfachen Befehlt - "rekursive Trigger deaktivieren"! GIBT es so etwas bei ORACLE (Vers. 9.20) auch?

    Vielen Dank für Eure Rückantworten!
    Georg

    - Bin nicht sicher, ob ich dich verstanden haben, aber in Oracle kannst du jeden Trigger disablen :

    ALTER TRIGGER MyTrigger DISABLE;

    - Im übrigen würde ich versuchen, generell von Triggern wegzukommen.

    Comment


    • #3
      Hallo Ulrich,

      danke für die Rückinfo.
      Den Trigger möchte ich nicht deaktivieren.
      Ich möchte, dass der Trigger in der 2. Tabelle nach einem Update auf die erste Tabelle nicht anstartet.
      Bsp. Trigger Tabelle1 macht ein "UPDATE" auf die Tabelle2.
      In der Tabelle2 gibt es einen Trigger der auf ein Update reagiert, feuert und etwas in Tabelle1 zurückschreibt (rekursiv bzw. durchgängig).
      Das möchte ich verhindern.

      Comment


      • #4
        Originally posted by GPF View Post
        Hallo Ulrich,

        danke für die Rückinfo.
        Den Trigger möchte ich nicht deaktivieren.
        Ich möchte, dass der Trigger in der 2. Tabelle nach einem Update auf die erste Tabelle nicht anstartet.
        Bsp. Trigger Tabelle1 macht ein "UPDATE" auf die Tabelle2.
        In der Tabelle2 gibt es einen Trigger der auf ein Update reagiert, feuert und etwas in Tabelle1 zurückschreibt (rekursiv bzw. durchgängig).
        Das möchte ich verhindern.
        - Hast du keine Möglichkeit, dies in die "normale" Applikationslogik zu packen ? Solche Triggersache sind immer heikel. Hast du die Updateprozeduren in PL/SQL vorliegen ? Dann würd cih dies auch dort abhandeln

        Comment


        • #5
          Klingt ziemlich verworren, aber du kannst in deinem Trigger eine Package-Variable setzen und diese im anderen Trigger berücksichtigen.

          Schema

          Code:
           
          Trigger1
          begin
            Package.ExecTrigger2 := false;
            Insert into ….
            Package.ExecTrigger2 := true;
           
          End;
           
          Trigger2
          begin
            If nvl(Package.ExecTrigger2, true) = false
            Then
              Return;
            End if;
          End;
          Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

          Comment


          • #6
            Du kannst im Trigger_1 eine Client_info setzen und diese in Trigger_2 abfrage um das Update in Trigger_2 zu verhindern.
            Das Deaktivieren des Trigger halte ich für gefählich, da ja zur selben Zeit ein anderer Tab_2 updaten kann.

            Comment


            • #7
              Originally posted by uminky View Post
              Du kannst im Trigger_1 eine Client_info setzen und diese in Trigger_2 abfrage um das Update in Trigger_2 zu verhindern.
              Das Deaktivieren des Trigger halte ich für gefählich, da ja zur selben Zeit ein anderer Tab_2 updaten kann.
              Daher auch die Verwendung von einer Package-Variable! Diese ist nun in der Session gültig und macht eine andere Session auch einen update auf die Tabelle (TAB2), läuft der Trigger ganz normal durch
              Wenn was schief gehen kann, dann geht es auch schief bzw. wenn man sich einen Fehler nicht erklären kann und dem nicht auf den Grund geht, hat das immer schlimme Folgen.

              Comment


              • #8
                @diddlMouse
                Sicher, du hast Recht. Hab ich überlesen.

                Comment

                Working...
                X