web-dev-qa-db-ja.com

プロダクションセーフなSQLストアドプロシージャのデバッグ

ネストされたSQLストアドプロシージャは膨大な数あり、それらをデバッグするさまざまな方法があります(開発者によって異なります)。

これまでのところ、私たちの方法は次のとおりです。

  1. オプションの@debugパラメータ。これにより、プロシージャが実行されるときにprintmessagesになります(変数を呼び出されたプロシージャに渡します)。

  2. チェック中@@servernameテストサーバー名のテーブルに対して、およびprinting上記のように

  3. 手順が行うすべてのことをログテーブルに書き込む(本番およびテスト)

これらのどれが好ましいか(そしてその理由)、または私たちが見落としているより良い方法はありますか?

6
Stu Pegg

SQL Server Profilerも考慮する必要があります。 SQL Server Management Studioで、[ツール]-> [SQLServerプロファイラー]を選択します。プロファイラーウィンドウが開いたら、[ファイル]-> [新しいトレース...]を選択します(他のRDBMSの詳細はわかりませんが、同様の機能を持つツールが必要です)。

長期的な解決策として、もちろん、ビジネスロジックをストアドプロシージャから移動する必要があります。

4
azheglov

個人的には#1が好きです。 @debugフラグは、本番コードを実行するかどうかを指定できます。printメッセージは、何が起こっているのかを理解するときに使用するのに最も役立つものの1つです。

2
Rachel

@debugまたは@testフラグをすべての複雑なストアドプロシージャの入力変数として使用しています。

私がそれをどうするかは、procによって異なります。通常、テストモードの場合はロールバックを発行します。また、ロールバックの前にさまざまな挿入の結果を表示して、期待したものが得られたものであるかどうかを確認することもできます。

@debugを使用するときに動的SQLがある場合、この場合はSQLを実行する代わりに出力するので、生成されたSQLステートメントを確認できます。

もちろん、@ test(データに影響を与えており、ロールバックできることを確認したい場合にのみ使用)と@debug(動的SQlを出力するため)を同じプロシージャに含めることができますが、通常は実行しません一度に両方のモード。

@printを使用して、デバッグしているときにステップを印刷することもできます(問題が発生した場所を確認するのに役立ちます)。または、テーブル変数を使用して、処理されたステップまたはエラーコードを保持し、テストモードのときにロールバック後にテーブル変数から、実際に何が起こったかを確認します。時間の経過とともにデータを表示する必要がある場合は、テーブル変数の値を永続テーブルに挿入することもできます(これは複雑なインポートに対して行うため、クライアントの安っぽいデータがインポートを中断し、その原因となった頻度をクライアントに示すことができます。問題を修正するための作業を行ってください。)ロールバック後も一時テーブルがロールバックされるため、一時テーブルではなくテーブル変数を使用することが重要です。

(テーブル変数の一時テーブルのものはSQL Server固有であることに注意してください。これが他のデータベースで機能するかどうかは、わかりません。)

プロファイラーは、データベースに送信された実際のsqlを提供することもできるため、ストアドプロシージャを使用していない場合は特に使用する必要があります。

1
HLGEM