24

できるだけ早く本番 SQL​​ Server 2005 サーバーに展開したいストアド プロシージャに、1 行のマイナーな変更 (文字列のタイプミスの修正) があります。

私が心配しているのは、正確な時間に変更ステートメントを実行してストアド プロシージャを更新するとどうなるかということです。何かが同時にそのストアド プロシージャを呼び出すことはありますか?

ストアド プロシージャの以前のコピーで実行されますか、それとも何らかの破損やエラーが発生する可能性がありますか?

SQL Server の ACID の性質を考えると、安全だと思います。特にSPが非常に小さいため、まったく同時に実行される可能性は非常に低いですが、私は確認することを好み、教育目的のためだけに答えにも興味があります.

おそらく、これには ServerFault の方が適しているでしょう。間違って投稿された場​​合は申し訳ありません。

ありがとうございました。

4

2 に答える 2

30

これをSQL Server 2008 R2でテストしました

私はから始めました:

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

次に、次の SQL Server クエリ ウィンドウ 1を実行しました。

EXEC dbo.Stupid

SQL Server クエリ ウィンドウ 2、クエリ ウィンドウ 1 でクエリを実行中:

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

EXEC dbo.Stupid

クエリ ウィンドウ 1 とクエリ ウィンドウ 2 でクエリを実行中に、SQL Server クエリ ウィンドウ 3:

EXEC dbo.Stupid

結果:

  • クエリ ウィンドウ 1 は 10 秒で実行され (したがって、ウィンドウ 2 および 3 の後に終了)、ID 1 ~ 5 が返されました。
  • クエリ ウィンドウ 2 が変更され、手順が 5 秒で実行され、ID 6 ~ 10 が返されました
  • クエリ ウィンドウ 3 は 5 秒で実行され、ID 6 ~ 10 が返されました

何が起こるのですか:

  • すでに実行中のコードは、開始されたときと同じようにプロシージャでの実行を完了します
  • コードが変更された後に実行を開始するものはすべて、新しいコードを実行します
于 2015-09-15T08:07:49.690 に答える
25

プロシージャにALTERを使用すると、スキーマ変更ロックが設定されます。SPはまだ存在しますが、クライアントはALTERが実行されるまで待機する必要があります。同じことがALTERにも当てはまり、SPがクライアントによって使用されなくなるまで待機します。

于 2013-02-21T11:30:19.557 に答える