マルチテナント・サービスの実現に向けて

2009年10月26日(月)
砂金 信一郎

オンプレミスからSQL Azureへの移行作業

 SQL Azureの使い道を理解していただいたところで、実際にオンプレミスのSQL ServerからSQL Azureにデータを移行する手順を説明します。SSIS(SQL Server 2008 Integration Services)と呼ばれる標準のデータ転送ツールを利用する方法もありますが、ここではスクリプトを手動で変更する過程を通じて、SQL Serverとの違いを明らかにします。

 まず、SQL Server 2008からスクリプトをエクスポートします。実際に試される際にデータベースのサンプルが必要な方は、「AdventureWorksLT2008」を利用してください。こちら(http://www.codeplex.com/MSFTDBProdSamples)からダウンロードで入手可能です。

 操作はSSMS(SQL Server Management Studio)から行います。現在のところエクスポートしたスクリプトを一部修正する必要がありますが、将来のバージョンではSQL Azure用のスクリプト修正を回避する機能が提供される予定です。SSMSで、サンプルのAdventureWorksLT2008データベースをアタッチしておきます。

 AdventureWorksLT2008データベースを右クリックし、[タスク] > [スクリプトの生成]を選択します。スクリプトウィザードの最初の画面で、[AdventureWorksLT2008]データベースを選択して、[選択したデータベース内の全てのオブジェクトのスクリプトを生成する]を選びます。

 以降のすべてのプロパティを設定し、[次へ]ボタンを押します。後からスクリプトを手動で編集できるように[スクリプトを新しいクエリウィンドウに保存]ラジオボタンを選択されたままの状態にしておき、最後に[完了]を押します。進ちょくがダイアログで表示されるので、完了するまで待って終了です。

 なお、スクリプトが生成された後で、これを手動で編集する必要がありますが、デフォルト・スクリプト・オプションを変更することによって、その際の作業をいくつか省くこともできます。図3に、変更対象のデフォルト・オプションと、変更を行うべき理由をまとめています。

サンプルDBのスクリプト変更にみるSQL Serverとの違い

 作成されたスクリプトをSQL Azureにインポートできるように、SQL Serverとの相違点を確認しながら少しずつ編集していきましょう。編集項目は少々多いですが、以下の13項目です。

1.SQL AzureがWindows認証をサポートしないので、先頭行を削除します。使用するユーザーアカウントはSQL Azure上で作成しておきます。

---------------------------------------------------
/****** Object: User [NT AUTHORITY\NETWORK SERVICE] Script Date: 07/20/2009 09:26:19 ******/
CREATEUSER [NT AUTHORITY\NETWORK SERVICE] FORLOGIN [NT AUTHORITY\NETWORK SERVICE] WITHDEFAULT_SCHEMA=[dbo]
GO
---------------------------------------------------

2.ユーザー定義型を宣言する文をスクリプトから削除します。CREATE TYPE文の出現個所をすべて削除します。

3.ファイル・グループに関するオプションを削除します。SQL Azureではファイル・グループを指定できません。文字列「ON [PRIMARY]」を、置換ですべて削除します。

4.NOT FOR REPLICATON制約の指定を削除します。SQL AzureではNOT FOR REPLICATON列制約をサポートしません。

5.サポートされていないインデックス・オプションのPAD_INDEX, ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKSを削除します。さまざまなインデックスに使用されている「WITH」文を置換します。具体的には「WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)」を「WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF)」に置き換えます。

6.「XML SCHEMA COLLECTION」の作成もサポートされないので、「CREATEXMLSCHEMACOLLECTION」文を削除します。

7.「XML SCHEMA COLLECTION」に対する参照が残ったままのテーブルが1つあるので、「[CatalogDescription] [xml](CONTENT [SalesLT].[ProductDescriptionSchemaCollection]) NULL,」という部分を探しだし、「[CatalogDescription] [xml] NULL,」に書き換えます。

8.XMLインデックスはサポートされないので、「CREATE PRIMARY XML INDEX」文を探しだして削除します。

9.ROWGUIDCOL列プロパティがサポートされないため、文字列「ROWGUIDCOL」を置換ですべて削除します。

10.「ANSI_NULLS」オプションの「ON」の設定をサポートしないため、文字列「SET ANSI_NULLS ON」を置換ですべて削除します。

11.「pad_indexPress」にあるサポートされないオプションのSORT_IN_TEMPDB,PAD_INDEX, ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKSを削除します。

12.「sort_in_tempdb」もサポートされないので削除します。

13.クラスタ化インデックスを使用する際には、データ挿入前に索引が作成されている必要があるため、BuildVersiontableテーブルにクラスタ化インデックスを追加しておきます。

---------------------------------------------------
CREATETABLE [dbo].[BuildVersion](
[SystemInformationID] [tinyint] IDENTITY(1,1)NOT NULL PRIMARY KEY CLUSTERED,
[Database Version] [nvarchar](25)NOTNULL,
[VersionDate] [datetime] NOTNULL,
[ModifiedDate] [datetime] NOTNULL
)
---------------------------------------------------

 これらの変更をいったん保存します。SQL Azureに接続した状態でツールバーの[解析]ボタンを押すことで、構文のエラーを確認できます。

■まとめ

 本連載は今回が最終回ですが、これまでの流れで、SQL Azureのメリットや、SQL Serverとの相違点、SQL ServerからSQL Azureへの移行する方法などをご理解いただけたのではないでしょうか?

 いくつかの未サポート機能に対処することで、SQL ServerのデータベーススキーマをSQL Azureに移行することは可能です。第1回「雲の上のリレーショナルデータベース」(http://thinkit.co.jp/article/1041/1/)でも述べたように、SQL Azureは今後、SQL Serverとの互換性を向上させていく予定です。

 SQL Serverで作成したリレーショナル・データベースがある方は、ぜひ一度、雲の上に乗せてみて下さい。

クラウドコンピューティングを主な守備範囲とするエバンジェリスト。日本オラクルでERPや新規事業開発を担当した経験を持つ。戦略コンサルタントだった時期もあるが、クラウドやAzureの可能性に惹き付けられマイクロソフトに参画。
ブログ  http://blogs.itmedia.co.jp/isago/
twitter http://twitter.com/shin135/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています