Ich arbeite seit einigen Wochen mit SQL-Abfragen und versuche, aus meinen Fehlern zu lernen und zu verstehen. Ich habe eine Tabelle mit zwei Spalten IsInvisible (bit)
und ShortName (string)
und wenn eine geändert wird, um die andere zu aktualisieren, mag ich auch: - wenn ein ~ vor dem Kurznamen hinzugefügt wird, um IsInvisible
auf 1 zu setzen , und wenn ~ entfernt wird, um es auf 0 zu setzen - wenn IsInvisible
gesetzt ist 1, um ~ vor dem Kurznamen hinzuzufügen, und wenn auf 0 gesetzt, um ihn zu entfernen.
Ich habe so etwas versucht wie:
ALTER TRIGGER [dbo].[updateInvisibility]
ON [dbo].[table]
AFTER UPDATE
AS
BEGIN
UPDATE t
SET IsInvisible = (CASE WHEN i.ShortName like '~%' THEN 1 ELSE 0 END),
ShortName = (CASE WHEN i.IsInvisible = 1 AND t.ShortName NOT LIKE '~%'
THEN '~' + t.ShortName
ELSE t.ShortName
END)
FROM table t JOIN
inserted i
ON t.Id = i.Id;
end
Mein Problem ist, dass beim Aktualisieren einer oder beider Spalten nichts passiert und folgende Fehlermeldung angezeigt wird:
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)
Was mache ich falsch?
Die Option "Auslöser zulassen, andere auszulösen" zeigt "True" an.
quelle
Antworten:
Hier ist das Problem:
updateInvisibility
updateInvisibility
ausgelöst wirdund dann macht es das so, dass Sie den Trigger am Ende viele Male auf eine Art rekursive Weise auslösen, ohne es zu merken. SQL Server lässt zu, dass diese Anrufverschachtelung 32 Ebenen tief ist, und löst dann den folgenden Fehler aus:
das ist ziemlich klar.
T-SQL-Lösung
Die Nur-Code-Lösung besteht darin, die Verschachtelungsebene zu überprüfen und zu verlassen, wenn sie größer als 1 ist (1 wird beim Update zum ersten Mal aufgerufen):
So was:
Alternative
Wie in einem Kommentar von RBarryYoung ausgeführt , können Sie dieses Problem zunächst verhindern, indem Sie rekursive Trigger deaktivieren.
quelle