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
Please also mark the comments that contributed to the solution of the article
Content-Key: 265000
Url: https://administrator.de/contentid/265000
Printed on: April 18, 2024 at 03:04 o'clock
2 Comments
Latest comment
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