Laden...

[Gelöst] Schachtelungsebene für Prozeduren, Funktionen, Trigger oder Sichten wurde überschritten

Erstellt von Reggi vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.821 Views
R
Reggi Themenstarter:in
25 Beiträge seit 2016
vor 7 Jahren
[Gelöst] Schachtelungsebene für Prozeduren, Funktionen, Trigger oder Sichten wurde überschritten

verwendetes Datenbanksystem: MS SQL 2012

Hallo zusammen,

ich habe mir mehrere Prozeduren geschrieben, die in einem After Insert Trigger aufgerufen werden, je nachdem welcher Datensatz aktualisiert werden muss.
Auf dem Rechner, wo ich das ganze entwickelt habe wird alles ohne Probleme ausgeführt.

Nun habe ich die Datenbank auf einem Server erstellt und versucht mehrere Datensätze einzufügen und bekomme die Meldung, dass die maximale Schachtelungsebene überschritten wurde.

Auf der Fehlersuche habe ich gesehen, dass sich Update-Trigger unendlich aufrufen und sowas auslösen können, aber der reagiert nur auf Insert.
Hier mal ein kleiner Ausschnitt:


BEGIN
	declare @tmpProtocolNo nvarchar(50)
	declare @tmpReceiverNo nvarchar(50)
	declare @counter int
	
	SET NOCOUNT ON;

	select @tmpProtocolNo = (select top 1([Protocol No_]) from inserted order by No_)
	select @tmpReceiverNo = (select top 1(No_) from inserted order by No_)
	select @counter = (select top 1(convert(int,substring(@tmpReceiverNo,5,16))) from inserted order by No_)

	-- Für alle Zeilen der Tabelle
	while (select @counter) is not null
	begin
		--Artikel
		if (select @tmpProtocolNo) = 'IF00010884'
		begin
			if (select Article_No from Article where Article_No = (select rtrim(substring([Message Part 01],1,50)) from GHV_Receiver_intern where [Protocol No_] = 'IF00010884' and No_ = @tmpReceiverNo)) is null
				EXEC p_InsertArticle @tmpProtocolNo, @tmpReceiverNo
			else
				exec p_UpdateArticle @tmpProtocolNo, @tmpReceiverNo
		end
                select @tmpProtocolNo = (select top 1([Protocol No_]) from inserted where convert(int,substring(No_,5,16)) > @counter order by No_)
		select @tmpReceiverNo = (select top 1(No_) from inserted where convert(int,substring(No_,5,16)) > @counter order by No_)
		select @counter = (select top 1(convert(int,substring(@tmpReceiverNo,5,16))) from inserted where convert(int,substring(No_,5,16)) > @counter order by No_)
	end

Das ist der erste Fall. Innerhalb der beiden Prozeduren wird eine andere aufgerufen und SQL-interne Funktionen, die man eben so braucht.

Ich weiß nicht genau, was ihr für Informationen braucht, um eine Idee zu haben, was das Problem sein könnte...
Wie gesagt in der Ursprungstabelle funktioniert alles.

Gibt es eventuell Einstellungen, die man machen müsste?

Vielen Dank schonmal

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

naja - die Fehlermeldung klingt recht eindeutig im Zusammenhang mit der MSDN.
Die maximale Verschachtelungstiefe ist per Default wohl bei 32 - und du würdest damit drüber kommen, weshalb das Ding abgewürgt wird.

Du kannst jetzt zwar sicher versuchen @@NESTLEVEL anzuheben - vermuten würde ich allerdings doch eher, dass hier eine Endlosschleife gebaut wurde. Würde somit mal schauen was sich hier so oft aufruft...

Nach all den beteiligten Procedures und Triggern frag ich nicht mal - denn sobald du alle Beteiligten gefunden hast löst sich das Problem wahrscheinlich fast von allein 😉

LG

R
Reggi Themenstarter:in
25 Beiträge seit 2016
vor 7 Jahren

Hey Taipi88,

ich dachte erst wirklich, dass es unlogisch ist die Prozeduren zu durchsuchen, wenn es auf einem anderen System funktioniert.

Deine Antwort macht aber ziemlich deutlich, dass es keine andere Fehlerquelle gibt und so ist es auch.
Hatte die ganzen Prozeduren über die gespeicherten Skripte erstellt auf dem Server.
In einem der Skripte hatte ich vergessen einen Testaufruf der Prozedur auszukommentieren. Sie hatte sich also unendlich oft selbst aufgerufen.

Vielen Dank für den Schubs in die richtige Richtung 😉.

Liebe Grüße
Reggi