異なるデータベースにあるテーブルの違いをしらべてみる
今回のやることを説明してみる
異なるデータベースに存在するテーブルの差異をチェックします。データベースサーバも開発系、本系など様々な系統を用意して、テストを実施していくかと思います。どうしても移行漏れなどが発生してしまいますよね。
使用する環境を説明してみる
Microsot Azure 上で 動作している Windows Server 2012 R2、SQL Server 2014 で動作確認をします。データベースは、AdventureWorks2012 を使用します。
テスト環境を準備してみる
- AdventureWorks2012 データベースを複製します。( 今回は、AdventureWorks2012_new としました。)
- 『 C:\Program Files\Microsoft SQL Server\120\COM 』
実際にためしてみる
テーブルの差異をチェックするにはtablediff Utility を使用します。tablediff utility の使い方は下記の通りです。
tablediff
[ -? ] |
{
-sourceserver source_server_name[\instance_name]
-sourcedatabase source_database
-sourcetable source_table_name
[ -sourceschema source_schema_name ]
[ -sourcepassword source_password ]
[ -sourceuser source_login ]
[ -sourcelocked ]
-destinationserver destination_server_name[\instance_name]
-destinationdatabase subscription_database
-destinationtable destination_table
[ -destinationschema destination_schema_name ]
[ -destinationpassword destination_password ]
[ -destinationuser destination_login ]
[ -destinationlocked ]
[ -b large_object_bytes ]
[ -bf number_of_statements ]
[ -c ]
[ -dt ]
[ -et table_name ]
[ -f [ file_name ] ]
[ -o output_file_name ]
[ -q ]
[ -rc number_of_retries ]
[ -ri retry_interval ]
[ -strict ]
[ -t connection_timeouts ]
}
早速、AdventureWorks データベースの Department でtablediff コマンドの動作を見てみます。コマンドプロンプト上で下記のコマンドを実行してみましょう。
tablediff -sourceserver localhost -sourcedatabase AdventureWorks2012 -sourceschema HumanResources -sourcetable Department -destinationserver localhost -destinationdatabase AdventureWorks2012_new -destinationschema HumanResources -destinationtable Department
当然ですが、二つのテーブルが同一とのメッセージが出力されました。tablediff には上記以外にも様々な機能をもっています。Department に行を追加してみましょう。
コマンドを実行すると、下図のような実行結果になります。DepartmentID = 17 が異なるという結果になっていますね。
これだけでは、レコードがどのように追加・変更されたのかは判断できません。そこで、-f オプションを追加し、実行します。
tablediff -sourceserver localhost -sourcedatabase AdventureWorks2012 -sourceschema HumanResources -sourcetable Department -destinationserver localhost -destinationdatabase AdventureWorks2012_new -destinationschema HumanResources -destinationtable Department -f C:\result
実行後、C:\配下を参照すると、result.sql ファイルが出力されます。
ファイルを参照してみると、AdventureWorks2012_new のデータベースの Department テーブルに存在しないレコードが INSERT 文になって出力されています。
次回何をするのかまたまた宣言してみる
SQL Server の Utility に関する説明をするのもおもしろいかもしれませんね。※コマンドプロンプトで実行するんじゃなくて、PowerShell での説明のほうがいいかな...