Lösch-Trigger bringt mich zur Verzweiflung!

03/02/2009 - 18:44 von Andy Dorwald | Report spam
Hallo,

wir haben auf einen SQL-Server 2008 migriert. Alles funktioniert auch
korrekt - nur eines geht nicht.

Nàmlich folgender Trigger:

-
ALTER TRIGGER [dbo].[T_SrvDB_DTrig] ON [dbo].[SrvDB] FOR DELETE AS
IF @@ROWCOUNT=0 RETURN

SET NOCOUNT ON
DECLARE @P INT

CREATE TABLE #SrvDel (P INT NULL,ID uniqueidentifier NULL)
SET @P=0

INSERT INTO #SrvDel (P,ID)
SELECT @P,ID FROM deleted

WHILE @@ROWCOUNT > 0

BEGIN
SET @P = @P + 1
INSERT INTO #SrvDel(P,ID)
SELECT @P,ID FROM dbo.SrvDB AS tmp WHERE EXISTS (SELECT * FROM #SrvDel AS
Loesch
WHERE Loesch.P=@P-1 AND tmp.Parent=Loesch.ID AND tmp.ID <> Loesch.ID)
DELETE FROM dbo.SrvDB WHERE EXISTS (SELECT * FROM #SrvDel AS Loesch WHERE
Loesch.P>0 AND dbo.SrvDB.ID=Loesch.ID)

END
-

Sobald der Trigger ausgeführt wird, erscheint die Meldung: "Der mehrteilige
Bezeichner "Loesch.ID" konnte nicht gebunden werden."

Auf unserem SQL-Server 2000 lief dies einwandfrei. Nun bin ich auch kein
SQL-Profi und derjenige, der uns vor 4 Jahren diesen Trigger erstellte, ist
nicht mehr greifbar.

Es scheint, als würde ich mich auf ein Feld beziehen, zu dem der Bezeichner
oder das DB-Schema (dbo) nicht klar ist. Aber ich verweise doch auf dbo!?!?!

Kann mir jemand weiterhelfen?

VG
Andy
 

Lesen sie die antworten

#1 Elmar Boye
04/02/2009 - 09:39 | Warnen spam
Hallo Andy,

Andy Dorwald schrieb:
wir haben auf einen SQL-Server 2008 migriert. Alles funktioniert auch
korrekt - nur eines geht nicht.

Nàmlich folgender Trigger:



Hier lief er, mit der unten angeführten Tabelle -
evtl ein Übertragungsfehler?

Ich habe den Trigger mal etwas aufgehübscht, damit er
besser lesbar wird.
Man könnte unter SQL Server 2008 zwar eine CTE dafür
nutzen, aber erstmal sollte er wieder laufen.

Gruß Elmar

USE tempdb
GO

CREATE TABLE dbo.SrvDB
(
id uniqueidentifier NOT NULL,
parent uniqueidentifier NOT NULL
)
GO

CREATE TRIGGER [dbo].[T_SrvDB_DTrig]
ON [dbo].[SrvDB]
FOR DELETE
AS
IF @@ROWCOUNT=0 RETURN

SET NOCOUNT ON
DECLARE @P INT

CREATE TABLE #SrvDel
(
P INT NULL,
ID uniqueidentifier NULL
)

SET @P=0
INSERT INTO #SrvDel (P, ID)
SELECT @P,ID FROM deleted
WHILE @@ROWCOUNT > 0
BEGIN
SET @P = @P + 1

INSERT INTO #SrvDel(P, ID)
SELECT @P,ID
FROM dbo.SrvDB AS tmp
WHERE EXISTS (SELECT *
FROM #SrvDel AS Loesch
WHERE Loesch.P = @P - 1
AND tmp.Parent = Loesch.ID
AND tmp.ID <> Loesch.ID)

DELETE FROM dbo.SrvDB
WHERE EXISTS (SELECT *
FROM #SrvDel AS Loesch
WHERE Loesch.P > 0
AND dbo.SrvDB.ID = Loesch.ID)
END
GO

INSERT INTO dbo.SrvDB VALUES('11111111-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000')
INSERT INTO dbo.SrvDB VALUES('11111111-1000-0000-0000-000000000000', '11111111-0000-0000-0000-000000000000')
INSERT INTO dbo.SrvDB VALUES('11111111-1000-1000-0000-000000000000', '11111111-1000-0000-0000-000000000000')
INSERT INTO dbo.SrvDB VALUES('11111111-1000-2000-0000-000000000000', '11111111-1000-0000-0000-000000000000')
INSERT INTO dbo.SrvDB VALUES('11111111-1000-2000-1000-000000000000', '11111111-1000-2000-0000-000000000000')
INSERT INTO dbo.SrvDB VALUES('11111111-1000-2000-2000-000000000000', '11111111-1000-2000-0000-000000000000')
GO

DELETE FROM dbo.SrvDB WHERE id = '11111111-1000-2000-0000-000000000000';
SELECT * FROM dbo.SrvDB
GO

Ähnliche fragen