Benötige ich eine Ausfallzeit, um eine gespeicherte Prozedur zu aktualisieren? (Aufgrund eines Fehlers "Definition geändert")

8

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?

Vaccano
quelle
3
Ist der Aufruf der gespeicherten Prozedur Teil einer größeren Transaktion? Hat es Code, der Schemasperren für irgendetwas aufhebt? Theoretisch sollte die Änderung nur blockiert werden. Können Sie näher darauf eingehen, was das Verfahren bewirkt und wozu es gehört?
Aaron Bertrand
@ Aaron Bertrand - es ist ein ziemlich harmloser Sproc. Es hat einige ausgewählte Top-Anrufe. Keine Schlösser oder ähnliches. Das einzig Wichtige ist, dass es einige "if" -Anweisungen gibt, die auf den Parametern basieren. Der tatsächliche Abfragelauf variiert etwas je nach den Parametern. Es wird von einem .net-Dienst aufgerufen.
Vaccano
2
Ein „ziemlich harmloser“ Vorgang sollte nicht vier Minuten dauern. Was macht es die ganze Zeit?
Aaron Bertrand
Haben Sie versucht, proc <proc Name> zu ändern 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.
MarmiK
dba.stackexchange.com/questions/154939/… Haben Sie sich diese Frage angesehen?
k010mb0

Antworten:

1

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.

Randolph West
quelle