1

本番 DB のスキーマを更新するための変更スクリプトを作成しました。そのビューの列の1つが削除されたため、ビューを削除して再作成する必要があります。

使う予定ですが、

DECLARE @sql NVARCHAR(MAX);
SET @sql = '<View Definition>';

EXEC sp_executesql @sql;

もしあれば、このアプローチを使用する際の落とし穴は何ですか? あなたが提案する代替案は何ですか?

Try catch ブロックを使用して、スクリプト全体をトランザクションの下に置いています。したがって、エラーがない場合、スクリプトはコミットされ、ロールバックされます。以下のように CREATE VIEW コマンドを使用しようとしましたが、TRASACTION と TRY-CATCH BLOCKS の導入後にエラーが発生しました。 .

エラーは「CREATE VIEW MUST BE THE ONLY STATEMENT IN THE BATCH」です。

IF EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName')
BEGIN 
DROP VIEW VwViewName
END

IF NOT EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName')
BEGIN 
     CREATE VIEW VwViewName
    <VIEW DEFINITION>
END    
4

1 に答える 1

2

スキーマの更新を実行しているため、次のような最小限の事項に従う必要があります

  • 繰り返し可能にする
  • バージョン管理システムに持っている
  • 本番環境で実行する前に、テスト環境でテストしてください。

再実行可能にするために、オブジェクトが存在するかどうかを確認してドロップし、再度作成するのが一般的な方法です。

IF動的 SQL は、句が持つ機能を追加しません。

例えば:

IF EXISTS(SELECT * FROM sys.views WHERE name = 'MyView')
BEGIN
    DROP VIEW [MyView]
END
GO
CREATE VIEW MyView AS 
    SELECT [Columns list ]
    FROM [MyTable]
GO

どちらが正当化されるかを私が知っている唯一のケースは、 /dynamic SQLを保持したい場合です。そのような場合、次の構文を使用できます。grantdeny

IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'MyView')
BEGIN
    EXEC sp_executesql N'CREATE VIEW MyView AS SELECT 1 AS Dummy'
END
GO
ALTER VIEW MyView AS 
    SELECT [Columns list ]
    FROM [MyTable]

go
GRANT .... 

Dynamic SQL以下のスクリプトのいずれかで名前を繰り返さなければならない数回を埋めるために を作成しません。私見では、展開スクリプトはできるだけ単純にする必要があります。

于 2013-09-08T10:27:09.347 に答える