1

Foo Db から tableA からいくつかの行を取得する MoveSomeItems という sp があります。Bar Db の tableA に移動します。

本当にアイテムを動かすかどうか、このspをテストしたいと思います。

このspをトランザクションで実行し、行を選択して移動するかどうかを確認するだけで十分ですか、それとも別の方法でアプローチする必要がありますか?

4

2 に答える 2

2

これは、すべてがうまくいかない場合の影響に依存しますか? 宛先テーブルに誤ったデータがあると、どのような影響がありますか?それは誰かを殺しますか、単に彼らを悩ませますか?それとも誰も気づかないでしょうか? 簡単に修正できますか?

あなたが与えたアプローチにはリスクが伴います。例えば:

  1. データベースが非常にビジーな場合、過剰なロックが発生したり、他のトランザクションが失敗する原因となるトランザクションでデッドロックが発生したりする可能性があります。TRANSACTION ISOLATION LEVEL を READ UNCOMITTED に設定し、DEADLOCK PRIORITY を LOW に設定すると、これを最小限に抑えることができますが、完全に排除することはできません。

  2. 他のトランザクションが READ UNCOMMITED 分離モードで実行されている可能性があります。その場合、ロールバックが発行されるまで一時的に挿入の結果が表示されます。

  3. テストしているプロシージャがその内部で COMMIT TRANSACTION を呼び出す場合、ROLLBACK を呼び出したときに必要な結果が得られない可能性があることに注意してください。

  4. データベースまたはログをプッシュして、ディスク容量が不足する可能性があります。

  5. 利用可能なすべての CPU、メモリ、ディスク IO、ネットワーク、またはその他の容量制限を使い果たす可能性があります。

  6. 最後に、これは完全なリストではないと思います。私が言おうとしている点は、奇妙な方法でうまくいかない可能性があるということです。

完全にバックアップされた個人開発データベースがある場合は、トランザクションは必要ありません。イベント後に復元するだけです。ただし、トランザクションにより、時間を節約できる場合があります。これが最も安全な解決策です。

共有開発データベースを使用している場合、あなたのアプローチは十分に受け入れられるかもしれませんが、特にチームとの関係がすでに悪い場合は、念のためにバックアップを行います.

稼働中のデータベースを使用している場合でも、システム全体がそれほど重要ではなく、修復中のダウンタイムに耐えることができる場合は、許容される可能性があります。もう一度バックアップを行います。

見ているデータベースが安全上重要なプロセスやその他のミッションクリティカルな機能を制御している場合は、そこに行かないでください。賠償責任保険の請求権を失うか、さらに悪いことになります。この場合、バックアップをテスト サーバーに復元し、そこでテストして、最初のシナリオを作成するのが最善です。ただし、これを行う際に考慮しなければならない問題がたくさんあることに注意してください。たとえば、テスト システムで個人情報を使用することは違法である可能性があります。また、テスト システムをライブ メール サーバーに接続しないなど、影響を与えないようにモック アウトする必要がある他のシステムへの依存関係がある場合もあります。

于 2012-08-27T09:08:29.473 に答える
0

テストしてロールバックできるようにしたい複雑なストアド プロシージャがある場合は、入力パラメーター (常に最後のパラメーターとして)、デフォルト値 0 の @debug を追加します (したがって、本番環境で実行されています)。

次に、パラメーター = 1 かどうかをテストするコードを最後に記述し、そうであれば、選択クエリを実行して、表示するデータを表示し、raiseerror を使用してプログラムを catch ブロックに送信します (try なしで複数のトランザクションを記述しないでください)。 catch block) をロールバックさせます。

このようにして、dev で結果を簡単に確認し、自動的にロールバックできます。

于 2012-08-27T17:02:25.197 に答える