Here's the trigger which causes the problem I guess. I just thought that SQL Server 2008 supports INSTEAD of triggers with recursion, I read something like that.
Antje
USE [ICService]
GO
/****** Object: Trigger [dbo].[TRIG_onEditPosition] Script Date: 01/29/2013 15:45:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TRIG_onEditPosition]
ON [dbo].[positionen]
INSTEAD OF UPDATE
AS
BEGIN
DECLARE @id int;
SET @id = (SELECT id FROM Deleted);
--prüfen, ob die Spalten start, oder ende betroffen waren, wenn ja löschen und neuer instert... (Columns_updated)
--IF (substring(columns_updated(),1,1) & 6) > 0 --es wird geprüft, ob die zweite und/oder dritte Spalte geändert wurde, das sollten start und ende sein.
IF ( (SELECT verbucht FROM Deleted d JOIN servicescheine ss ON d.saschein_id = ss.id) = 1)
RAISERROR (N'Es wurde versucht eine verbuchte Position zu ändern! Das ist unzulässig!',12,12) WITH LOG;
ELSE
IF ( UPDATE (start) OR UPDATE (ende) )
--PRINT 'es ist entweder start, oder ende vom Update betroffen.'
IF (((SELECT start FROM deleted) <> (SELECT start FROM inserted)) OR ((SELECT ende FROM deleted) <> (SELECT ende FROM inserted)))
BEGIN
IF ((SELECT start FROM inserted) <> (SELECT ende FROM inserted))
BEGIN
--es wurde eines der Datums geändert! - deshalb muss die Prozedur aufgerufen werden!
-- ausser es handelt sich um einen stunden-datensatz...
--alten Datensatz löschen
DELETE FROM positionen WHERE id = @id;
--den kompletten Datensatz neu anlegen (dadurch keine Probleme bei Datumsübertrag);
-- außerdem Sicherung möglich.... bzw Protokollierung
DECLARE @sd datetime, @ed datetime, @a varchar(32), @b varchar(256), @kstK int,
@sas int, @atc int, @wlbe int, @f bit, @pause decimal(3,2), @stdSatz money;
SELECT @sd = start,
@ed = ende,
@a = arbeit,
@kstK = kostenstelle_id,
@sas = saschein_id,
@atc = arbeitstyp_id,
@f = fahrt,
@wlbe = wlbEintrag,
@b = bemerkungen,
@pause = pause,
@stdSatz = stdSatz
FROM inserted;
EXECUTE insertPosition @sd, @ed, @a, @kstK, @sas, @atc, @f, @wlbe, @pause, @stdSatz, @b;
END;
else
UPDATE positionen
SET start = I.start,
ende = I.ende,
arbeit = I.arbeit,
bemerkungen = I.bemerkungen,
kostenstelle_id = I.kostenstelle_id,
saschein_id = I.saschein_id,
arbeitstyp_id = I.arbeitstyp_id,
wlbEintrag = I.wlbEintrag,
fahrt = I.fahrt,
stunden = I.stunden,
pause = I.pause,
stdSatz = I.stdSatz,
provision_id = I.provision_id,
bezahlteStunden = I.bezahlteStunden
FROM positionen p, inserted I
WHERE p.id = I.id;
END;
--wenn die Datumswerte nicht betroffen waren, ganz normales Update ausführen:
else
BEGIN
--PRINT 'start oder Ende betroffen, aber nicht geändert, Ganz normales Update';
UPDATE positionen
SET start = I.start,
ende = I.ende,
arbeit = I.arbeit,
bemerkungen = I.bemerkungen,
kostenstelle_id = I.kostenstelle_id,
saschein_id = I.saschein_id,
arbeitstyp_id = I.arbeitstyp_id,
wlbEintrag = I.wlbEintrag,
fahrt = I.fahrt,
stunden = I.stunden,
pause = I.pause,
stdSatz = I.stdSatz,
provision_id = I.provision_id,
bezahlteStunden = I.bezahlteStunden
FROM positionen p, inserted I
WHERE p.id = I.id;
END;
ELSE
BEGIN
--PRINT 'Weder start, noch Ende betroffen, Ganz normales Update';
UPDATE positionen
SET start = I.start,
ende = I.ende,
arbeit = I.arbeit,
bemerkungen = I.bemerkungen,
kostenstelle_id = I.kostenstelle_id,
saschein_id = I.saschein_id,
arbeitstyp_id = I.arbeitstyp_id,
wlbEintrag = I.wlbEintrag,
fahrt = I.fahrt,
stunden = I.stunden,
pause = I.pause,
stdSatz = I.stdSatz,
provision_id = I.provision_id,
bezahlteStunden = I.bezahlteStunden
FROM positionen p, inserted I
WHERE p.id = I.id;
END;
END;