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.AntjeUSE [ICService]GO/****** Object: Trigger [dbo].[TRIG_onEditPosition] Script Date: 01/29/2013 15:45:15 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[TRIG_onEditPosition] ON [dbo].[positionen]INSTEAD OF UPDATEASBEGIN 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;