0

現在、 と という名前の列をいくつか使用しているテーブルがありDateFromますDateToNewDateそれらを単一の列に置き換えようとしており、既存の行に からの値が入力されていますDateFrom

変更が失敗した場合、中間のテーブルが必要ないため、元に戻したいため、適切なエラー/トランザクション処理が必要です。

いろいろやってみましたが、うまくいきません。私はこれを経験していないので、どんな助けも大歓迎です。

私はから始めました

BEGIN TRAN

ALTER TABLE TableName
ADD NewDate DATETIME

IF @@ERROR = 0 AND @@TRANCOUNT = 1
UPDATE TableName
SET NewDate = ValidFrom
....

NewDate現在テーブルの列ではないため、これはすぐに失敗します。いいので、そこに a を追加GOします。これにより、2 つのバッチに分割され、実行されるようになりましたが、@@ERRORチェックが無意味になります。また、ローカル変数も後で失われるため、使用できませんGOTRY...CATCH 理想的には、各ステートメントの後にエラーをチェックしないようにするために a を使用したいのですがGO、1 つのバッチである必要があるため、a を使用することはできません。

私が見つけた記事の中で、この状況について話しているものはありません (エラー処理 with GO)。質問は次のとおりです。列を追加および更新するときに探しているエラー処理のあるトランザクション アプローチを取得する方法はありますGOか (どこかで必要になるようです)。

それとも、何か問題が発生した場合に元のテーブルにロールバックする機能なしで、いくつかのバッチでそれを行うことで解決する必要がありますか?

4

1 に答える 1

0

トランザクションで新しい列を作成することを心配しているのはなぜですか? 列を作成してから入力するだけです。設定するときに明示的な tran も必要ありません。失敗した場合 (ほとんどありません)、更新をやり直してください。

次の手順を実行します

  1. 新しい列を追加
  2. 新しい列を更新
  3. 新しい列のデータが正しいかどうかを確認します
  4. 不要になった古い列を削除します (削除する前に、これらの列がどこで使用されているかを確認することをお勧めします。たとえば、ストアド プロシージャ、レポート、フロントエンド アプリケーション コードで使用されているかなど)。

また、質問にコンテキストを追加する価値があります。テスト データベースに対してスクリプトをテストしていて、後でそのスクリプトを本番データベースに適用するとします。prod データベースは非常に大きいですか? とても忙しい?ミッションクリティカル?スケジュールに従ってバックアップしますか?

于 2012-10-16T14:22:49.817 に答える