今、www.naosan.jpでサイト構築作業をしているのだが、懸案となっていたのが稼働環境におけるデータベース(DB)の構築作業だ。サイトの一部のデータはDBに置いて、それをASP.NETからアクセスさせようというわけなのだが、DBはあらかじめ用意しておいたものを使いたいのだ。つまり、開発中にローカルに作成したDBを、そっくりそのまま稼働環境に移して、あとはWebページのファイルなどを転送するだけ、といったようにしたいのだ。これに必要なのがDBのコピーなのだが、簡単にできるようで非常に手間と時間のかかった作業であった。
まず最初にお断りしておくが、開発環境(ローカル)はSQL Server 2005 Express Editionを使い、稼働環境(Webサイト)ではSQL Server 2005を使う。つまり、SQL Server間でデータのコピーを行えればよいので、意外と簡単なのではないか?と思ったのが浅はかであった。
まず思いついたのは、DBのテーブルのエクスポート機能とインポート機能を使うというものであった。SQL Server Management Studio(SSMS)にはこの機能があるので、さっそく手元のSSMSを起動してみる(SSMSの導入については別記事: なおさん亭::別館: 無料で作るASP.NETでWebサイト(10)(最終回)―データのエクスポートを参照)。だが、SSMSといっても無料版のSQL Server Management Studio Express Edition(SSMSEE)であるので、インポート・エクスポート機能は省かれているようだ。とすると、この機能は使えないことになる。使いたければ、製品版を購入するしかないが、そんな金はない。さっさと見切りを付けて、次の選択肢に移る。
次は、SQL Server 2005 Express Editionに付属のBCPユーティリティを使ってエクスポートだけを行い、Webサイト側でBULK INSERTを実行して一気に取り込もうというものだ。BCPユーティリティを使うと、たとえばCSV形式でテーブルのデータを保存できる。これをWebサイト側のDBに接続したSSMSEEのクエリエディタで実行すればよい。もちろん、ローカルのテーブル定義はSQL文として保存し、Webサイト側でそのSQLを実行して同じ構造のテーブルを作成しておく。結論から言うと、これもダメであった。私の契約しているサイトでは、一括インポートの権限がユーザに与えられないようだ。とすると、この方法もダメということになる。さっさと見切りを付けて、次の選択肢に移る。
次の選択肢といってもなぁ、データコピーのSQL文をしこしこ書くか、あるいは本当に製品版を買うしかないのかと思ってネットをググっていたら、こんな記事を見つけた。
SQL Server Expressの基本:データのインポート/エクスポート:ITpro
この記事によれば、「SQL Serverインポートおよびエクスポートウィザード」(DTSWizard)を使えば対話式でデータのコピーができるようだ。SQL Server 2005 Service Pack 1から入るようになった機能で、SQL Server 2005 Express EditionではService Pack 2で使えるようになる。さっそく、手元のSQL Server 2005 Express Editionを、Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2にグレードアップしてみる。
ダウンロードとインストールのとてつもない長い時間…。インストール完了後、上記記事にあった場所を見てみるが、そもそもそんなフォルダ自体がない。う~ん、何がおかしいのかと思い、さらにググっていると、さらにMicrosoft SQL Server 2005 Express Edition Toolkit Service Pack 2というのもインストールしなければならないことが判明した。これもインストールしてみる。ダウンロードとインストールのとてつもない長い時間…。それにしても、なにゆえにこんなに時間がかかるのか?
改めて、上記記事の示す場所をチェックしてみると、ある!確かにある。さっそく起動してみる。使い方は簡単で、コピー元のデータソース、サーバ名、認証情報、データベースを指定し、コピー先の同様の情報を指定、そしてコピーするテーブルを指定するだけだ。実際にやってみれば、あらら簡単、指定したテーブルのすべての行情報がきちんと移る。なるほどこりゃ便利だ、もともとはSSISという管理のためのツールらしいが、スポット的に活用することももちろん問題ない。
気を付けなければならないのは、コピー先のテーブルがその都度削除されるわけではないので、何度も実行するとどんどんと行が増えていく。主キー指定などがあれば、制約違反となったりするので、コピーに先立ってはコピー先の対象テーブルを削除しておくなど、前処理が必要だ。もちろん、これにはSSMSEEが使える。
ざっと駆け足で、SQL Server 2005間でテーブルのコピーを行った例を紹介してみた。結局、無償のツールだけを使ってもかなりのことができるようだ。非常にありがたいのだが、それにしてもMicrosoft、もっとわかりやすくソフトウェアをリリースして欲しいと思うのは贅沢だろうか?