Announcement

Collapse
No announcement yet.

MS SQL AFTER Trigger läuft nicht

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

  • MS SQL AFTER Trigger läuft nicht

    Hallo Zusammen,

    ich habe folgenden Trigger erstellt:

    ------------------------------
    USE [meine_db]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[nuller_trigger]
    ON [dbo].[meine_tbl]
    AFTER INSERT
    AS
    DECLARE @match tinyint, @com_ref varchar(32)
    SELECT @match=COM_RES, @com_ref=COM_REF FROM meine_tbl

    UPDATE andere_db.dbo.Kunden
    SET
    Kunden_FLG = CASE
    WHEN @match = 0 THEN 0
    ELSE null
    END,
    Kunden_Datum = CASE
    WHEN @match = 0 THEN GETDATE()
    ELSE null
    END
    WHERE
    Kunden_ID = @com_ref
    ------------------------------

    Dieser Trigger wird aber leider nie nach einem Insert ausgeführt.

    Viele Grüße,
    Jim Hawkins

  • #2
    Hallo Jim,

    gibt es eine Fehlermeldung?
    Gibt es in der Tabelle meine_tbl mehr als einen Datensatz?
    [highlight=SQL]SELECT @match=COM_RES, @com_ref=COM_REF FROM meine_tbl[/highlight]
    Das Statement liefert Dir irgendeinen com_ref aus der Tabelle und mit höchster Wahrscheinlichkeit nicht den, der aktualisiert wurde.

    Die aktualisierte Datensätze stehen übrigens in den virtuellen Tabellen "inserted" und "deleted" zur Verfügung.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo Olaf,

      was verstehst Du unter den virtuellen Tabellen "inserted" und "deleted"?

      Eine Fehlermeldung bekomme ich nicht. Ich hab mir auch schon einen weiteren Trigger erstellt, welcher @match und @com_ref in eine andere Tabelle schreibt.
      Dort kommen auch Werte, bzw. ein Wert an. Es schein so, als würden die Variablen @match und @com_ref nicht zurückgesetzt werden.

      Kann das sein? Wenn, wie kann ich die Variablen zurücksetzten, so dass diese bei jedem neuen Triggeraufruf wieder verwendet werden?

      Comment


      • #4
        Hallo Jim,

        lies Dir bitte noch mal meine Antwort durch:
        Die Variabeln werden gesetzt, aber mit irgend einem "Zufallswert" aus Deiner Tabelle; das Statement ist logisch falsch.

        In der Tabelle "deleted" stehen die betroffenen Datensätze mit Stand vor dem Update, in "inserted" nach dem Update.
        Die kannst Du verwenden, um die betroffenen Datensätze zu aktualisieren.
        [highlight=SQL]UPDATE andere_db.dbo.Kunden
        SET Kunden_FLG = CASE WHEN inserted.COM_RES = 0
        THEN 0 ELSE null END,
        Kunden_Datum = CASE WHEN inserted.COM_RES = 0
        THEN GETDATE() ELSE null END
        FROM andere_db.dbo.Kunden AS K
        INNER JOIN
        inserted ON K.Kunden_ID = inserted.COM_REF[/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hallo Jim,

          vielleicht solltest du dir das mal genau durchlesen ...

          bye,
          Helmut

          Comment


          • #6
            Vielen Dank für Eure Hilfe. Jetzt läuft mein Trigger.

            Für alle, die mal einen ähnlichen benötigen.
            Nach der Änderung sieht der funktionierende Trigger wie folgt aus:

            CREATE TRIGGER [dbo].[triggername]
            ON [dbo].[meine_db]
            AFTER INSERT
            AS
            UPDATE meine_db.dbo.kunden_tbl
            SET
            Kunden_flag = CASE
            WHEN ins.COM_RES = 0 THEN 'n'
            ELSE null
            END,
            Kunden_datum = CASE
            WHEN ins.COM_RES = 0 THEN GETDATE()
            ELSE null
            END
            FROM
            meine_db.dbo.kunden_tbl kun
            INNER JOIN
            inserted ins ON ins.COM_REF = kun.Kunden_ID
            WHERE
            Kunden_ID = ins.COM_REF

            Viele Grüße,
            Jim

            Comment

            Working...
            X