Forums Neueste Beiträge
 

Triggerproblem

18/05/2009 - 11:15 von Susanne Senger | Report spam
Hallo, NG,

ich habe einen ziemlich einfachen Trigger,

CREATE TRIGGER trBereich
ON TABLE1
FOR INSERT, UPDATE
AS IF UPDATE (PLZ)
UPDATE TABLE1
SET Vertreter= 0
WHERE (Vertreter IS NULL)

UPDATE TABLE1
SET Vertreter= tblBereiche.Vertreter
FROM TABLE1 INNER JOIN
tblBereiche ON TABLE1.ZIP0 >= tblBereiche.plzstart AND TABLE1.PLZ<=
tblBereiche.plzend
WHERE (TABLE1.LAND= N'D') OR
(TABLE1.LAND IS NULL)

Wenn ein User auf die DB zugreift und eine Änderung am Feld PLZ vornimmt,
kommt entweder die Meldung, dass der DS bereits geàndert wurde und daher die
Änderungen des Users verworfen werden oder die Anwendung steht. Was habe ich
falsch gemacht??

Danke schon mal.

Susanne
 

Lesen sie die antworten

#1 Elmar Boye
18/05/2009 - 11:43 | Warnen spam
Hallo Susanne,

"Susanne Senger" schrieb ...
ich habe einen ziemlich einfachen Trigger,



den Du in zwei Punkten ausbauen solltest.


CREATE TRIGGER trBereich
ON TABLE1
FOR INSERT, UPDATE
AS



Füge hier ein (wegen unten)
SET NOCOUNT ON;

IF UPDATE (PLZ)



Wenn sich das IF UPDATE auf beide Akutalisierungen
beziehen soll, so füge kapsele die UPDATE mit BEGIN ... END
denn derzeit wird die PRüfung nur für das erste UPDATE
vorgenommen. (Für Klarheit könnte auch sonst ein BEGIN...END
sorgen)


Und verknüpfe die Aktualisierungen mit der inserted
Tabelle, denn derzeit wird die ganze Tabelle aktualisiert,
was zum einen unnötiger Aufwand ist, zum anderen auch zu
Blockierungen uam. führen kann.


UPDATE TABLE1
SET Vertreter= 0
WHERE (Vertreter IS NULL)



IN
UPDATE TABLE1
SET TABLE1.Vertreter = 0
FROM TABLE1
INNER JOIN inserted AS i
ON TABLE1.PKSpalte = inserted.PKSpalte
WHERE i.Vertreter IS NULL


UPDATE TABLE1
SET Vertreter= tblBereiche.Vertreter
FROM TABLE1



INNER JOIN inserted AS i
ON TABLE1.PKSpalte = inserted.PKSpalte

INNER JOIN
tblBereiche ON TABLE1.ZIP0 >= tblBereiche.plzstart AND TABLE1.PLZ<= tblBereiche.plzend
WHERE (TABLE1.LAND= N'D') OR
(TABLE1.LAND IS NULL)

Wenn ein User auf die DB zugreift und eine Änderung am Feld PLZ vornimmt, kommt entweder die Meldung, dass der DS bereits geàndert
wurde und daher die Änderungen des Users verworfen werden oder die Anwendung steht. Was habe ich falsch gemacht??



Das dürfte am fehlenden SET NOCOUNT ON liegen.
Bei DAO/ADO (mit oder ohne Access dazwischen) wird auf
die Zahl der geànderten Zeilen geprüft.
Bei abweichender Anzahl durch die Trigger-UPDATE-Anweisungen
vermutet die Anwendung eine fehlerhafte Aktualisierung und
setzt die Änderung zurück.

Das "Stehen der Anwendung" kann auf ein Blockierung zurückzuführen
sein, da Du wie oben geschrieben, derzeit alle Zeilen anfaßt und
nicht nur die durch die Anwendung gerade geànderte.

Gruß Elmar

Ähnliche fragen