M$SQL2005: Delete-Trigger löscht nicht alle Tupel
JCB
- datenbank
0 Frank (no reg)0 JCB
Juten Tach :)!
Folgendes Szenario:
MS SQL 2005 DB-Server
3 Tabellen
Tab1 hat Kindertupel in Tab2
Tab2 hat Kindertupel in Tab3
der Tab1.DeleteTrigger soll beim löschen in Tab1 die Kindertupel in Tab2 löschen
der Tab2.DeleteTrigger soll beim löschen in Tab2 die Kindertupel in Tab3 löschen
Beispiel:
Tab1 hat ein Tupel mit 2 Kindertupeln in Tab2.
Die beiden Kindertupel haben widerrum 2 Kindertupel in Tab3.
Lösch ich also das Tupel in Tab1 sollten ja alle Tabellen leer sein.
Jedoch sind nur Tab1 und Tab2 leer. In Tab3 wurden nur die Kindertupel des ersten in Tab2 zu löschenden Tupel gelöscht. Ich hoffe man kann mir folgen ;).
Irgendwie wird der Trigger von Tab2 scheinbar nur einmal ausgelöst. Nur warum?
Hier noch kurz die beiden Trigger:
--#################################
ALTER TRIGGER Tab1_Delete
ON dbo.Tab1
FOR DELETE
AS
DECLARE @mObjektID int,
@mKlassenID smallint
SELECT @mObjektID = ObjektID FROM deleted
SELECT @mKlassenID = KlassenID FROM deleted
DELETE FROM Tab2
WHERE Tab2.ParentID = @mObjektID
AND Tab2.ParentCL = @mKlassenID
--############################################
ALTER TRIGGER Tab2_Delete
ON dbo.Tab2
FOR DELETE
AS
DECLARE @mObjektID int,
@mKlassenID smallint
SELECT @mObjektID = ObjektID FROM deleted
SELECT @mKlassenID = KlassenID FROM deleted
DELETE FROM Tab3
WHERE Tab3.ParentID = @mObjektID
AND Tab3.ParentCL = @mKlassenID
Im Prinzip ja 2mal das gleiche.
Hat jemand ne Ahnung, warum der 2. Trigger nicht funzt, bzw. evtl. nur einmal ausglöst wird?
Gruß, Jan
Hallo,
Irgendwie wird der Trigger von Tab2 scheinbar nur einmal ausgelöst. Nur warum?
Weil es so ist.
Ob du eine "grössere Menge" oder nur einen einzelnen Datensatz aus der Tabelle löschst, der Trigger wird genau _1 Mal_ aufgerufen, er reagiert auf den Event DELETE auf dem Objektlevel Tabelle.
"deleted" ein Recordset, was dann diese Menge beinhaltet
Wenn du also auf Basis der gelöschten Menge in anderen Tabellen löschen möchtest, dann solltest du auch nicht nur einen Wert aus der Menge selektieren (wie in SELECT @mObjektID = ObjektID FROM deleted
) sondern evt. mit dem IN Operator arbeiten à la DELETE b WHERE Id IN (SELECT ObjektID FROM deleted)
.
HTH
Frank
Hallo,
Hi!
Ob du eine "grössere Menge" oder nur einen einzelnen Datensatz aus der Tabelle löschst, der Trigger wird genau _1 Mal_ aufgerufen, er reagiert auf den Event DELETE auf dem Objektlevel Tabelle.
"deleted" ein Recordset, was dann diese Menge beinhaltet
Wenn du also auf Basis der gelöschten Menge in anderen Tabellen löschen möchtest, dann solltest du auch nicht nur einen Wert aus der Menge selektieren (wie in
SELECT @mObjektID = ObjektID FROM deleted
) sondern evt. mit dem IN Operator arbeiten à laDELETE b WHERE Id IN (SELECT ObjektID FROM deleted)
.
Das ist ja ein "ahh" und ein "ohh" wert ;). Wieder was gelernt :). Ich _danke_ Dir!!
Ich wünsch ein schönes WE :)!
Gruß,
Jan