0

SQL Server で複数の DDL (約 90) を実行しようとしています。

DDL には、テーブルへの変更は含まれず、ビュー、ストアド プロシージャ、および関数のみが含まれます。DDL 間に相互依存関係がある場合があります (たとえば、ある STP が別の STP を呼び出すなど)。

ファイルを正しい順序で整理するのは時間がかかりすぎるため、開始したくありません。また、スクリプトのいずれかにエラーが発生した場合は、操作全体が失敗するようにしたいと考えています。

どうすればこれを達成できますか?

これまでの私の考えは、トランザクションを開始し、SQL にエラーを無視するように指示することです (これを行う方法はわかりません)。すべてが成功したらコミットします。

  1. これは良い考えですか?
  2. CREATE \ ALTERエラーがある場合でも、ストアド プロシージャまたはビューをどうすればよいですか?

いくつかの懸念を明確にし、対処するために...

これは生産用ではありません。テストしているDBを壊れたままにしたくないだけです。

私が達成したいのは、サーバー上でスクリプトの大きなグループを実行することです。それらを注文するのに時間をかける必要はありません。しかし、スクリプトのいずれかにエラーがある場合は、操作全体をロールバックしたいと考えています。

分離は気にしません。操作を単一のトランザクションとして実行したいだけです。

4

3 に答える 3

4

ファイルを正しい順序で整理し、テスト環境で手順をテストし、検証と受け入れテストを行ってから、運用環境で実行します。

トランザクションで DDL を実行することは可能に見えるかもしれませんが、実際には不可能です。トランザクションとうまく混合できない DDL ステートメントが多数あります。アプリケーションをオフラインにし、スキーマを変更する前にデータベースのバックアップを作成 (またはスナップショットを作成) し、テストおよび検証済みのアップグレード手順 (スクリプト) を実行し、受け入れテストで結果を検証してから、アプリケーションをオンラインに戻す必要があります。何かが失敗した場合は、最初に作成されたバックアップに戻します (レプリケーション、ログ シッピング、ミラーリングなどのダウンストリーム ログ コンシューマーに対するすべての影響を伴います)。

これが正しい方法であり、私に関する限り唯一の方法です。これを間違った方法で行う方法について、多くのアドバイスが見つかることを私は知っています。

于 2013-06-20T11:00:09.127 に答える
0

あなたは良い答えを持っています、ここに「ハック」の答えがあります。「これはできませんが、どうしてもやりたい場合は続けてください」の場合。あなたが考えていることを達成することはできないと私は確信しています。

フルバックアップを!

COMMITこれらのファイルのいずれにもorGOステートメント (明示的または暗黙的!)がないと仮定すると、実行する必要があるのは、1 つのトランザクションでそれらを実行することだけです。それらを 1 つのファイルに結合し、トランザクションにラップして実行します。

90 個のファイルを 1 つのファイルに結合する方法:

名前で並べ替えると正しい順序になる場合は、コマンドプロンプトでファイルを含むフォルダーからこれを実行します。

FOR /F "tokens=1" %G IN ('dir /b /-d /o:n *.sql') DO (
    type %G >> Big_SQL_Script.sql && echo. >> Big_SQL_Script.sql 
    )

順序がランダムな場合は、ファイルのリストを作成しdir /b /-d *.sql > File_Name_List.txtて手動で並べ替えます。次に実行します。

FOR /F "tokens=1" %G IN (File_Name_List.txt) DO (
    type %G >> Big_SQL_Script.sql && echo. >> Big_SQL_Script.sql 
    )

このようにして、自動化された順序で 90 個のファイルを連結できます。実行して、何が起こるか見てください。

幸運を!

于 2013-06-26T21:20:39.650 に答える