現在展開中のシステムをアップグレードする単一の T-SQL スクリプトを作成しようとしています。スクリプトには、次の混合が含まれます。
- 新しいテーブル
- 既存のテーブルの新しい列
- 新機能
- 新しいストアド プロシージャ
- ストアド プロシージャの変更
- 新しいビュー
- 等
これはかなり大規模なアップグレードであるため、スクリプトの一部が失敗した場合は、スクリプトをロールバックさせたいと考えています。以下に、試行したコードの概要を示します。
DECLARE @upgrade NVARCHAR(32);
SELECT @upgrade = 'my upgrade';
BEGIN TRANSACTION @upgrade
BEGIN
PRINT 'Starting';
BEGIN TRY
CREATE TABLE x ( --blah...
);
ALTER TABLE y --blah...
);
CREATE PROCEDURE z AS BEGIN ( --blah...
END
GO --> this is causing trouble!
CREATE FUNCTION a ( --blah...
END TRY
BEGIN CATCH
PRINT 'Error with transaction. Code: ' + @@ERROR + '; Message: ' + ERROR_MESSAGE();
ROLLBACK TRANSACTION @upgrade;
PRINT 'Rollback complete';
RETURN;
END TRY
END
PRINT 'Upgrade successful';
COMMIT TRANSACTION @upgrade;
GO
注 - 一部の構文が完全ではないことはわかっています - コードのキーを再設定する必要があります
ストアド プロシージャをトランザクション ブロックに入れることができないようです。これには理由がありますか?という言葉の使い方のせいGO
でしょうか。その場合、どうすれば SP をトランザクション ブロックに入れることができますか? トランザクション ブロックに入れることができるものに関する制限は何ですか? または、私が達成しようとしていることのより良い代替手段は何ですか?
ありがとう