マルチテナント・サービスの実現に向けて
オンプレミスから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で作成したリレーショナル・データベースがある方は、ぜひ一度、雲の上に乗せてみて下さい。