Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

TRIGGER Aufbau

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von chrisi303, 22 September 2016.

  1. chrisi303

    chrisi303 Aktiver Benutzer

    Hallo zusammen,
    ich versuche mich gerade das erste mal an einem Triggre da ich diesmal nicht die Arbeit duch ein externes Script erledigen lassen möchte. Leider klappt das mit meine MSMSQL Kenntnissen nur bedingt.

    Ich möchte das die ersten 8 Zeichne (Bestellnummer) in die jeweilige Kunden Historie eingetragen wird.
    Wie muss ich es Notieren das ich ausgaben vom Select in der Insert unten benutzen kann.

    der Triggre

    Code:
    ALTER TRIGGER [dbo].[trgAbgleichBestellung]   ON [dbo].[tLieferantenBestellungPos]
    AFTER INSERT
    AS
    BEGIN
    select pos.kLieferantenBestellungPos, pos.kLieferantenBestellung, pos.cArtNr , pos.cname, left (pos.cHinweis,8) AS AB, best.cEigeneBestellnummer
    from inserted pos
    
    join [dbo].[tLieferantenBestellung] best
    on best.kLieferantenBestellung = pos.kLieferantenBestellung;
    
    
    INSERT INTO dbo.tKundenHistorie (kKunde, cString, dErstellt, kBenutzer)
    VALUES (3920, AB, CURRENT_TIMESTAMP , 29);
    
    
    END
    Fehlermeldung Ungültiger Spaltenname 'AB'.

    ein denk Anstoß wäre super
     
  2. ukulele

    ukulele Datenbank-Guru

    Das ist simpel:
    Code:
    INSERT INTO zieltabelle(spalte1,spalte2,spalten)
    SELECT spalte1,'irgendwas tolles',irgendeine_funktion()
    FROM quelltabelle
    
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Mrm. Wenn das bei einem TRIGGER bei jedem INSERT feuert, dann dürfte Zieltabelle bald recht groß sein. Und, falls da ein PK und/oder Unique ist, auch bald scheitern.
     
  4. ukulele

    ukulele Datenbank-Guru

    Achso jetzt sehe ich erst deine Fehlermeldung. Die kommt weil in VALUES() AB vermutlich ein String sein soll, er ist aber nicht in Hochstriche gesetzt also denkt SQL es muss sich um einen Spaltennamen oder sowas handeln.

    Der Select vorweg ist in dem Trigger natürlich nicht sehr sinnvoll weil du das Ergebnis nirgendwo hin schreibst...
     
  5. chrisi303

    chrisi303 Aktiver Benutzer

    vielen Dank habe es umgestellt war der Falsche Ansatz so Funktioniert es.
    nur noch an einer Stelle hängt es. Ich hätte gerne das nur der INSERT ausgeführt wird wenn sich nur die spalte 'nBestaetigt' ändert. So wie er jetzt ist wird er immer ausgeführt .


    Code:
    ALTER TRIGGER [dbo].[tgr_tlieferantenBestellung_INSUPDEL]
    ON [dbo].[tLieferantenBestellung]
    AFTER UPDATE
    AS
    BEGIN
        IF UPDATE(nBestaetigt)
        BEGIN
        INSERT INTO dbo.tKundenHistorie (kKunde, cString, dErstellt, kBenutzer) VALUES ((select cBezugsAuftragsNummer from inserted  ), 'Bestellung bestätigt ' , CURRENT_TIMESTAMP , 29);
        END
    
    END
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ich weiß nicht, ob M$SQL das kann, in PostgreSQL kannst Du sagen:

    CREATE TRIGGER ... WHEN ( OLD.column != NEW.column)

    Damit hast Du einen 'conditional Trigger', der nur feuert, wenn sich die genannte Spalte ändert, und sonst nicht. Das ist in Performance-Sicht durchaus eine sinnvolle Sache.
     
  7. ukulele

    ukulele Datenbank-Guru

    Das mit dem IF UPDATE(column) nutze ich auch, ist aber problematisch. Wenn deine Anwendung z.B. UPDATE tabelle SET spalte=spalte macht ändert sich der Wert zwar nicht, die Spalte wird aber aktualisiert also ist die Bedingung UPDATE(column) immer wahr.

    Du kannst aber wie von akretschmer empfohlen vorgehen, nur musst du die Tabellen old und new bzw. bei MSSQL inserted und deleted wirklich abfragen. In etwa so:
    Code:
    SELECT i.cBezugsAuftragsNummer
    FROM inserted i
    LEFT JOIN deleted d ON i.pk = d.pk
    WHERE i.nBestaetigt IS NULL AND d.nBestaetigt IS NOT NULL
    OR i.nBestaetigt IS NOT NULL AND d.nBestaetigt IS NULL
    OR i.nBestaetigt != d.nBestaetigt
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden