都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

異なるデータベースにあるテーブルの違いをしらべてみる

今回のやることを説明してみる

 異なるデータベースに存在するテーブルの差異をチェックします。データベースサーバも開発系、本系など様々な系統を用意して、テストを実施していくかと思います。どうしても移行漏れなどが発生してしまいますよね。

使用する環境を説明してみる

 Microsot Azure 上で 動作している Windows Server 2012 R2、SQL Server 2014 で動作確認をします。データベースは、AdventureWorks2012 を使用します。

テスト環境を準備してみる

  • AdventureWorks2012 データベースを複製します。( 今回は、AdventureWorks2012_new としました。)

    f:id:koogucc11:20140920135845p:plain

  •  コマンドプロンプトから tablediff コマンドを実行するため、下記のパスをシステム環境変数に追加します。

    f:id:koogucc11:20140920152632p:plain

  • 『 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

f:id:koogucc11:20140920154002p:plain

 当然ですが、二つのテーブルが同一とのメッセージが出力されました。tablediff には上記以外にも様々な機能をもっています。Department に行を追加してみましょう。

f:id:koogucc11:20140920155018p:plain

 コマンドを実行すると、下図のような実行結果になります。DepartmentID = 17 が異なるという結果になっていますね。

f:id:koogucc11:20140920155208p:plain

 これだけでは、レコードがどのように追加・変更されたのかは判断できません。そこで、-f オプションを追加し、実行します。

tablediff -sourceserver localhost -sourcedatabase AdventureWorks2012 -sourceschema HumanResources -sourcetable Department -destinationserver localhost -destinationdatabase AdventureWorks2012_new -destinationschema HumanResources -destinationtable Department -f C:\result

f:id:koogucc11:20140920183925p:plain

 実行後、C:\配下を参照すると、result.sql ファイルが出力されます。

f:id:koogucc11:20140920184022p:plain

 ファイルを参照してみると、AdventureWorks2012_new のデータベースの Department テーブルに存在しないレコードが INSERT 文になって出力されています。

f:id:koogucc11:20140920184150p:plain

次回何をするのかまたまた宣言してみる

 SQL Server の Utility に関する説明をするのもおもしろいかもしれませんね。※コマンドプロンプトで実行するんじゃなくて、PowerShell での説明のほうがいいかな...