場合によっては、巧妙に作成されたUPDATEステートメントを本番環境で実行すると、その日を節約できます。場合によっては、失敗したUPDATEが最初の問題よりも大きな損害を引き起こす可能性があります。Data Manipulation Language(DML)ステートメントは開発データベースまたはテストデータベースでいつでも実行できますが、データの違いにより、このアプローチでは、本番データに対するステートメントの影響を判断するのが最善の方法です。
では、INSERT、UPDATE、またはDELETEステートメントを実行する前に、本番データでどのような結果になるかを正確に予測するためのオプションは何ですか?それは、少なくとも部分的には、データベースのベンダーと製品に依存します。広く支持されているソリューションもいくつかあります。このブログでは、両方のオプションを見ていきます。
構文チェック
ステートメントをテストするプロセスは、2つの段階に分けることができます。1つ目は、ステートメントが構文的に有効である(つまり、実行される)ことを確認することです。次のステップは、意図した結果が得られるかどうかを確認することです。
構文を検証する1つの方法は、データベース(DB)にクエリプランを問い合わせることです。これにより、次の2つのことがわかります:
- クエリに構文エラーがあるかどうか。その場合、クエリプランコマンド自体が失敗します。
- DBがクエリの実行をどのように計画しているか。例えば、どのインデックスを使用するか。
ほとんどのリレーショナルDBでは、次のように、クエリプランコマンドは“explain”または“describe”です。
explain update ...;
Navicatのデータベース管理および開発ツールでは、ボタンをクリックするだけでEXPLAINコマンドを実行できます。ステートメントが失敗すると、次のようなエラーメッセージが表示されます:
それ以外の場合、クエリプランは表形式で表示されます。
ステートメントのテスト
ステートメントを解析して構文的に有効かどうかを確認できますが、正しい結果が得られるとは限りません。クエリが実際に何をするかを確認するためには、いくつかのオプションがあります。
自動コミットをオフにする
ほとんどのリレーショナルDBでは、自動コミットモードを無効にする方法が提供されており、変更をディスクに保存するためにCOMMITステートメントを発行するか、変更を無視するためにROLLBACKを発行する必要があります。
SQL Serverでは、コマンドは次のとおりです:
SET autocommit=0 Or SET autocommit = OFF
In SQL Server, the command is:
SET IMPLICIT_TRANSACTIONS OFF
自動コミットをオフにすると、トランザクション内でステートメントを実行して試す準備が整います:
-- 1. start a new transaction START TRANSACTION; -- 2. insert a new order for customer 145 INSERT INTO orders(orderNumber, orderDate, requiredDate, shippedDate, status, customerNumber) VALUES(@orderNumber, '2005-05-31', '2005-06-10', '2005-06-11', 'In Process', 145); -- 3. then, after evaluating the results, -- rollback the changes ROLLBACK;
これにより、DBはステートメントを実行する前とまったく同じ状態になります。
ステートメントをSELECTに変換する
DMLステートメントをテストするための明らかにローテクなアプローチは、ステートメントをSELECTに変換することです。ステートメントがデータベース全体を取得することを期待しない限り、影響を受けるレコードを正確に確認するためにSELECTとしてステートメント実行することをお勧めします。必要なことは、アクションワードをSELECTに置き換えるだけです。
INSERT INTO orders... BECOMES SELECT * FROM ORDERS...
結論
本番環境でDMLステートメントを実行することほど恐ろしいことはほぼありません。ありがたいことに、リスクを最小限に抑える方法があるので、フィンガークロスしたり、アヴェ・マリアを暗唱したりする必要はありません。
Navicat 16を試用したい場合は、ここから14日間の試用版をダウンロードできます。