2013-02-21 17 views
15

Ho una piccola modifica di una riga (che risolve un errore di battitura in una stringa) a una stored procedure che desidero distribuire al nostro server SQL Server 2005 di produzione il prima possibile.Cosa succede se si modifica una procedura memorizzata mentre è in esecuzione?

La preoccupazione che ho è cosa succede se al momento esatto si esegue l'istruzione alter per aggiornare la mia stored procedure, succede che qualcosa chiama quella stored procedure allo stesso tempo?

Esegue la copia precedente della procedura memorizzata o può provocare alcuni errori o corruzioni?

Considerando la natura ACID di SQL Server, mi aspetto che sia sicuro. Le probabilità che funzioni nello stesso momento, specialmente da quando l'SP è piuttosto piccolo, sono estremamente basse, ma preferisco essere sicuro, e sono anche interessato alla risposta, solo per scopi didattici.

Probabilmente, ServerFault sarebbe un posto migliore per questo, scusa se è misposted.

Grazie.

+6

Quando ** esegui ** una stored procedure, questa viene caricata in memoria, analizzata, viene determinato un piano di query e quindi eseguito. Quindi, dopo che è stato caricato nel primo passaggio, è possibile modificarlo completamente, questo non avrà alcun impatto sull'esecuzione in esecuzione. –

risposta

16

Quando si utilizza ALTER per la procedura, viene impostato un blocco di modifica dello schema. L'SP esiste ancora, ma i client dovranno attendere fino all'esecuzione di ALTER. Lo stesso vale per ALTER, aspetterà che l'SP non venga utilizzato dai client.

+0

Grazie mille. –

10

Ho appena provato questo in SQL Server 2008 R2

ho iniziato con:

CREATE PROCEDURE dbo.Stupid 
AS 
WAITFOR DELAY '0:00:10' 
SELECT TOP 5 * FROM dbo.UniqueId 
GO 

ho poi fatto la seguente SQL Server Query Finestra 1:

EXEC dbo.Stupid 

SQL Server Query Finestra 2, mentre la query in Query Window 1 era in esecuzione:

ALTER PROCEDURE dbo.Stupid 
AS 
WAITFOR DELAY '0:00:05' 
SELECT TOP 5 * FROM dbo.UniqueId 
WHERE ID > 5 
GO 

EXEC dbo.Stupid 

SQL Server Query Finestra 3, mentre le query in Query Finestra 1 e Query Finestra 2 erano in esecuzione:

EXEC dbo.Stupid 

Risultati:

  • Query Finestra 1 corse in 10 secondi (e quindi terminato dopo Windows 2 e 3), e restituito id 1 - 5
  • Query Finestra 2 alterato e corse la procedura in 5 secondi, ed è tornato ids 6-10
  • Query Finestra 3 corse in 5 secondi ed è tornato ids 6 - 10

Cosa succede:

  • già l'esecuzione di codice completerà in esecuzione sulla procedura come lo era quando sono stati avviati
  • Tutto ciò che inizia a funzionare dopo il codice viene modificato verrà eseguito il nuovo codice
+0

Buona ricerca !! –