ukulele
Datenbank-Guru
- Beiträge
- 5.306
Also es gibt auf jedenfall mehrere Ansatzpunkte, die Reihenfolge ist nicht ganz unerheblich.
Das guckt welche USERNUMBERs einen RN Eintrag bekommen haben und löscht in ActInv. Wenn deine Anwendung erst danach versucht den Eintrag in ActInv zu ändern wird das möglicherweise einen Fehler provozieren.
Sauberer könnte es sein einen INSTEAD OF Trigger auf ActInv zu schreiben der beim setzen des Eintrags von 500 auf 200 guckt, ob noch ein RN da ist (das wird ja dann in deinem Beispiel bereits wieder auf WN stehen) und wenn nicht, die Anzahl auf 0 setzt oder die Zeile ganz löscht. Dazu kenne ich aber zu wenig von der Tabelle da der INSTEAD OF Trigger auch alle anderen Vorgänge betrifft.
Code:
CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DELETE
FROM ActInv
WHERE ActInv.USERNUMBER IN ( SELECT i.USERNUMBER
FROM INSERTED i
WHERE i.TRANSCODE = 'RN' )
UPDATE UserTransactions
SET UserTransactions.TRANSCODE = ( CASE WHEN i.TRANSCODE = 'WN' THEN 'RN' ELSE 'WN' END )
FROM UserTransactions
INNER JOIN INSERTED i
ON UserTransactions.USERNUMBER = i.USERNUMBER
WHERE i.TRANSCODE IN ( 'WN','RN' )
AND UserTransactions.TRANSCODE IN ( 'WN','RN' )
END;
Sauberer könnte es sein einen INSTEAD OF Trigger auf ActInv zu schreiben der beim setzen des Eintrags von 500 auf 200 guckt, ob noch ein RN da ist (das wird ja dann in deinem Beispiel bereits wieder auf WN stehen) und wenn nicht, die Anzahl auf 0 setzt oder die Zeile ganz löscht. Dazu kenne ich aber zu wenig von der Tabelle da der INSTEAD OF Trigger auch alle anderen Vorgänge betrifft.