Ich habe immer gedacht, dass ich eine gespeicherte Prozedur aktualisieren kann, während Benutzer das System aktiv nutzen.
Aber ich teste gerade ein Update für eine gespeicherte Prozedur und während ein lang laufender Aufruf des Sproc ausgeführt wurde (es war mehr als 4 Minuten nach dem Aufruf), habe ich den Sproc aktualisiert. (Ich hatte vor, einen anderen Abfrageplan in einem separaten Fenster auszuprobieren.)
Als ich zu dem lang laufenden zurückkehrte, hatte ich diesen Fehler:
The definition of object 'MySprocName' has changed since it was compiled.
Dieser Fehler scheint zu sagen, dass jeder Sproc, der aktiv ausgeführt wird, fehlschlägt, wenn die Definition dieses Sproc aktualisiert wird. (Ich dachte, sobald ein Sproc gestartet wurde, würde er diesen Plan trotz Änderungen an der Definition für den Rest des Laufs verwenden.)
Ist das wahr? Muss ich Ausfallzeiten haben, um die Definition eines Sproc zu aktualisieren?
WITH RECOMPILE
? Dies ist eine Option auf Prozedurebene, mit der festgelegt wird, dass die Prozedur nach jedem Lauf neu kompiliert wird. Dies bedeutet, dass der Plan immer neu kompiliert wird und somit verhindert wird, dass zwischengespeicherte Pläne wiederverwendet werden.Antworten:
Ja, es stimmt, dass Sie eine aktiv ausgeführte gespeicherte Prozedur nicht ändern sollten, da sie SQL Server nicht gefällt.
In Bezug auf Ausfallzeiten sollten Sie als Best Practice keine Änderungen an häufig verwendeten gespeicherten Prozeduren in einer geschäftigen Produktionsumgebung während der Betriebszeiten vornehmen.
quelle