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

Trigger für Update erstellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von worm77, 2 Juli 2019.

  1. worm77

    worm77 Neuer Benutzer

    Hallo zusammen

    Ich muss einen Trigger erstellen, der mir mehrere Felder einer Tabelle updated.
    Die Werte, die rein geschrieben werden sollen, kommen aus den gleichen Feldern, derselben Tabelle.

    Meine Tabelle sieht so aus:

    BelegNr, KrediBeleg, Gewicht, Spediteur
    123,,,
    124,123,50,Speedy

    Nun soll das Gewicht und der Spediteur vom zweiten Datensatz beim ersten eingetragen werden, die Verknüpfung wäre dann BelegNr = KrediBeleg.

    Aber irgendwie scheint mir das zu kompliziert zu sein, bringe das nicht hin.

    Hab's mit folgendem SQL probiert, hat aber nicht funktioniert:

    update buchung
    set (Gewicht, Spediteur) = (select Gewicht, Spediteur from Buchung where KrediBeleg is not null)
    where BelegNr = KrediBeleg

    Kann mir da jemand erklären, wie ich das hinkriege?

    Besten Dank für eure Unterstützung

    Gruss Rolf
     
  2. ukulele

    ukulele Datenbank-Guru

    Also zunächst mal ist dein Tabellen-Design schlecht. Es stellt sich die Frage warum Informationen redundant abgelegt werden?

    Dann verstehe ich die (geplante) Funktionsweise von BelegNr nicht. Warum referenziert BelegNr. auf KrediBeleg? Kannst du die Information nicht über einen Join holen?

    Und außerdem, wie soll der Trigger denn verfahren?
    - Wann wird BelegNr gesetzt, existiert KrediBeleg da schon?
    - Wann feuert der Trigger, bei Insert oder auch bei Update? Verändert Sich BelegNr?
    - Verändert sich KrediBeleg oder wird KrediBeleg gelöscht? Ist KrediBeleg immer eindeutig oder gibt es mehrere Datensätze mit dem selben KrediBeleg?

    Ohne den Trigger ginge das wie folgt:
    Code:
    UPDATE tabelle
    SET tabelle.Gewicht = t.Gewicht,tabelle.Spediteur = t.Spediteur
    FROM tabelle
    INNER JOIN tabelle t
    ON tabelle.BelegNr = t.KrediBeleg
    Aber nochmals, das ist nichts weiter als ein Join über eine sich offenbar selbst referenzierende Tabelle. Das muss man nicht zwingend schreiben wenn man es in einer Abfrage ermitteln kann.
     
    Walter gefällt das.
  3. worm77

    worm77 Neuer Benutzer

    Nun, wir haben die längste Zeit auch mit dem Softwarehersteller probiert, eine Liste zu erstellen, die die Daten zusammen sucht und haben's aufgegeben.
    Es handelt sich dabei um zwei Kreditoren-Rechnungen, die eine ist die Spedition der ersten. Nun wollen wir eben die Daten von der Speditionsrechnung auf die Lieferantenrechnung übertragen, damit die Liste dann diese Informationen anzeigen kann.
    Der Trigger soll beim Insert und Update ausgeführt werden, da es sein kann, dass die Kredi-Rechnungsnummer ändert (falls man sich verschreibt und korrigieren muss).
    Die BelegNr hingegen ändert nicht.
    Die BelegNr wird vom Programm automatisch vergeben und ändert sich nicht. Zu dem Zeitpunkt existiert der KrediBeleg noch nicht.
     
  4. ukulele

    ukulele Datenbank-Guru

    Müsste das dann nicht eher andersrum sein, also das der zweite Datensatz (Spedition) über seine KrediBeleg-Spalte den ersten Datensatz referenziert? Das klänge geringfügig logischer, denn KrediBeleg ist ja änderbar.
     
  5. worm77

    worm77 Neuer Benutzer

    Im Feld KrediBeleg gebe ich die Belegnummer der Kreditorenrechnung ein, zu welcher die Speditionsrechnung gehört.
    Dann wird das Gewicht und der Spediteur von dieser Speditionsrechnung auf die Kreditorenrechnung geschrieben.
    Ich hab den Trigger jetzt erstellt und das funktioniert wunderbar.
    Besten Dank für deine Unterstützung.
     
  6. ukulele

    ukulele Datenbank-Guru

    Jetzt war das natürlich ein allgemeiner Join, du aktualisiert mit jedem Trigger der auslöst also alle Datensätze der Tabelle. Ich weiß nicht wie umfangreich das ist, vielleicht möchtest du lieber nur Datensätze nehmen die in INSERTED stehen (also der Tabelle die im Trigger nur betroffene Datensätze bereit stellt). Das wäre zu empfehlen. Allerdings musst du dann berücksichtigen das du wenn du die Speditionsrechnung änderst (der Datensatz steht in INSERTED) die Kreditorenrechnung aktuallisieren musst. In etwa so:
    Code:
    UPDATE   tabelle --Kreditorenrechnung
    SET       tabelle.Gewicht = i.Gewicht,
           tabelle.Spediteur = i.Spediteur
    FROM   tabelle --Kreditorenrechnung
    INNER JOIN INSERTED i --Speditionsrechnung
    ON       tabelle.BelegNr = i.KrediBeleg
    Das gilt für Update oder Insert. Delete wird vermutlich keine Rolle spielen, Rechnungen werden ja i.d.R. nicht gelöscht.
     
  7. worm77

    worm77 Neuer Benutzer

    Super! Besten Dank!
     
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