Mit MS-SQL-Trigger ein Wert in eine andere Tabelle übertragen
Hallo zusammen,
ich habe ein kleines Problem. Ich habe 2 Tabellen die 1:n verknüpft sind.
Aufträge zu Liefertermine
Es gibt zu jedem Auftrag mehrere Termine. Ich will in der Tabelle vom Auftrag immer den frühestmöglichen Termin haben. Das wollte ich über ein Trigger machen... nur wie?
Ich hätte mir so etwas gedacht:
CREATE TRIGGER LieferterminGeaendert ON Liefertermine
AFTER UPDATE
BEGIN
SELECT TOP 1 @new_liefertermin = Liefertermin
FROM Liefertermine
WHERE Erledigt = 0 AND Auftragsnummer = ???
ORDER BY Liefertermin ASC;
Update Auftragsdaten SET NaechsterLiefertermin = @new_liefertermin WHERE Auftragsnummer = ???
END
Mein Problem: Es geht einfach nicht, wie mach ich denn die Zugriff auf den aktuellen DS der Liefertermine (um die Auftragsnummer zu bekommen) und wie übergebe ich dann den "errechneten" Liefertermin an die Auftragsdaten (so wie im moment mit @new_liefertermin versucht).
Ich denke das das Problem ganz simpel ist nur irgendwie komm ich hier nicht so richtig weiter...
Gruß
Stefan
ich habe ein kleines Problem. Ich habe 2 Tabellen die 1:n verknüpft sind.
Aufträge zu Liefertermine
Es gibt zu jedem Auftrag mehrere Termine. Ich will in der Tabelle vom Auftrag immer den frühestmöglichen Termin haben. Das wollte ich über ein Trigger machen... nur wie?
Ich hätte mir so etwas gedacht:
CREATE TRIGGER LieferterminGeaendert ON Liefertermine
AFTER UPDATE
BEGIN
SELECT TOP 1 @new_liefertermin = Liefertermin
FROM Liefertermine
WHERE Erledigt = 0 AND Auftragsnummer = ???
ORDER BY Liefertermin ASC;
Update Auftragsdaten SET NaechsterLiefertermin = @new_liefertermin WHERE Auftragsnummer = ???
END
Mein Problem: Es geht einfach nicht, wie mach ich denn die Zugriff auf den aktuellen DS der Liefertermine (um die Auftragsnummer zu bekommen) und wie übergebe ich dann den "errechneten" Liefertermin an die Auftragsdaten (so wie im moment mit @new_liefertermin versucht).
Ich denke das das Problem ganz simpel ist nur irgendwie komm ich hier nicht so richtig weiter...
Gruß
Stefan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 265000
Url: https://administrator.de/contentid/265000
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo Stefan,
Zugriff auf den aktuell geänderten Datensatz erhältst Du über die nur im Trigger vorhandenen Tabellen inserted und deleted, die alle eingefügten und gelöschten Datensätze enthalten. Bei einem insert-Befehl ist nur inserted gefüllt, bei einem delete-Befehl nur deleted und bei einem update sind die alten DS in deleted und die neuen in inserted, wobei die beiden Tabellen immer so aussehen von den Spalten her, wie die Tabelle oder Sicht, für die der Trigger definiert ist.
Wenn Du nur einen DS änderst, dann wäre so ein "SELECT TOP 1 @new_liefertermin = Liefertermin" noch ok, aber sobald mehrere DS vom update betroffen sind, mußt Du das anders machen. Für Deinen Trigger müßte folgender Befehl passen (ungetestet, mangels Tabellen):
Zur Erläuterung:
Ändern willst Du die Tabelle Auftragsdaten, und zwar alle Aufträge, die vom Update betroffen sind. Dabei reicht es, die betroffenen Aufträge einmal festzustellen (select distinct Auftragsnummer from inserted). Der Wert, der dann im set NaechsterLiefertermin verwendet wird, ist dann Dein select top 1 ..., wobei immer die passene Auftragsnummer eingesetzt wird.
Gruß, Mad Max
Zugriff auf den aktuell geänderten Datensatz erhältst Du über die nur im Trigger vorhandenen Tabellen inserted und deleted, die alle eingefügten und gelöschten Datensätze enthalten. Bei einem insert-Befehl ist nur inserted gefüllt, bei einem delete-Befehl nur deleted und bei einem update sind die alten DS in deleted und die neuen in inserted, wobei die beiden Tabellen immer so aussehen von den Spalten her, wie die Tabelle oder Sicht, für die der Trigger definiert ist.
Wenn Du nur einen DS änderst, dann wäre so ein "SELECT TOP 1 @new_liefertermin = Liefertermin" noch ok, aber sobald mehrere DS vom update betroffen sind, mußt Du das anders machen. Für Deinen Trigger müßte folgender Befehl passen (ungetestet, mangels Tabellen):
update Auftragsdaten
set NaechsterLiefertermin = (select top (1) Liefertermin from Liefertermine where Auftragsnummer = a.Auftragsnummer and Erledigt = 0 order by Liefertermin)
from Auftragsdaten a
join (select distinct Auftragsnummer from inserted) i on i.Auftragsnummer = a.Auftragsnummer
Zur Erläuterung:
Ändern willst Du die Tabelle Auftragsdaten, und zwar alle Aufträge, die vom Update betroffen sind. Dabei reicht es, die betroffenen Aufträge einmal festzustellen (select distinct Auftragsnummer from inserted). Der Wert, der dann im set NaechsterLiefertermin verwendet wird, ist dann Dein select top 1 ..., wobei immer die passene Auftragsnummer eingesetzt wird.
Gruß, Mad Max