TRIGGER Aufbau

chrisi303

Aktiver Benutzer
Beiträge
32
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
 
Werbung:
Das ist simpel:
Code:
INSERT INTO zieltabelle(spalte1,spalte2,spalten)
SELECT spalte1,'irgendwas tolles',irgendeine_funktion()
FROM quelltabelle
 
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.
 
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...
 
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
 
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 .

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.
 
Werbung:
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
 
Zurück
Oben