SQL Azure Team Blog

Finding Your Clustered Indexes – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL Server から SQL Azureにマイグレーションする前に全てのテーブルにクラスターインデックスを作成する必要があります。その理由については、このエントリーを参照してください。このエントリーでは、クラスターインデックスが無いテーブルを見つける方法を紹介します。

SQL Serverデータベースから更新しマイグレーションするテクニックの一つは、スクリプ生成ウィザードを使用して、SQL Azureに同じスキーマを転送することです。それに関しては、このエントリーで書きました。このテクニックを使用する場合は、SQL Serverで次のスクリプトを実行して、クラスターインデックスのないテーブルを探します。

SELECT DISTINCT [TABLE] = OBJECT_NAME(OBJECT_ID)
FROM SYS.INDEXES
WHERE INDEX_ID = 0 AND OBJECTPROPERTY(OBJECT_ID,'IsUserTable') = 1
ORDER BY [TABLE]

クラスターインデックスの無いテーブルリストを取得できます。クラスターインデックスを簡単に作成する方法は、非クラスタインデックスをクラスタインデックスに変更することです。SQL Server Management Studioで実行することができます。

1.オブジェクトエクスプローラーで、テーブルのツリーを開き、テーブルのインデックスを拡げます。

2. クラスターインデックスに変更したい、非クラスタインデックスを選択します。

3. 右クリックをし、「インデックスをスクリプト化」の「Drop toおよびCreate To」を選択します。

vs07

4. SQL Serverはインデックスを削除し、再作成するTransact-SQLを生成します。

5. CREATE INDEX文からNONCLUSTEREDを探し、CLUSTERDに変更します。

6. スクリプトを実行します。

 

次のクエリは、SQL Server Management Studioによって生成されたスクリプト例です。

/****** Object:  Index [PK_GroupFeature]  
  Script Date: 06/01/2010 17:00:47 ******/
IF  EXISTS (SELECT * FROM sys.indexes 
    WHERE object_id = OBJECT_ID(N'[dbo].[GroupFeature]') 
    AND name = N'PK_GroupFeature')
ALTER TABLE [dbo].[GroupFeature]
 DROP CONSTRAINT [PK_GroupFeature]
GO

USE [Kulshan]
GO

/****** Object:  Index [PK_GroupFeature] 
   Script Date: 06/01/2010 17:00:48 ******/
ALTER TABLE [dbo].[GroupFeature] ADD
  CONSTRAINT [PK_GroupFeature] 
  PRIMARY KEY CLUSTERED 
(
    [GroupFeature_Id] ASC
)WITH (PAD_INDEX  = OFF, 
    STATISTICS_NORECOMPUTE  = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = OFF, ONLINE = OFF, 
    ALLOW_ROW_LOCKS  = ON,
    ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

SQL Server から SQL Azureにマイグレーションしたいテーブル全てにクラスタインデックスを作成してしまえば、SQL Azureでの開発に一歩近づきます。

SQL Azure Team Blog

SQL Azure and Session Tracing ID – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

もし注意を払っていたら、SQL Azureに接続しているとSQL Server Management Studio 2008 R2に新しいプロパティ(セッショントレースID)が追加されていることに気がついたかもしれません。

セッショントレース識別子は、全てのSQL Azureの接続時に生成されるユニークなGUIDです。サーバサイド上で、SQL Azureチームは、セッショントレースIDによって全ての接続の記録と追跡をしています。つまり、もしセッション識別子とエラーが起こったことがわかれば、Azure Developerサポートは、エラーを探し、エラーの原因を追及することができます。

 

SQL Server Management Studio

 

SQL Server Management Studioで、接続プロパティウィンドウでセッショントレース識別子を取得することができます。

vs03

 

Transact-SQL

 

下のクエリを使用してTransact-SQLでセッショントレースID識別子を取得することができます。

SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO())

 

C#

 

またはC#でも取得することができます。

using (SqlConnection conn = new SqlConnection(…))
{
    // Grab sessionId from new connection
    using (SqlCommand cmd = conn.CreateCommand())
    {
        conn.Open();
         cmd.CommandText = "SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO())";
        sessionId = new Guid(cmd.ExecuteScalar().ToString());
    }
}

重要なことは、セッショントレースIDは、クライアントサイド上のADO.NETコネクションプールとサーバへの接続ごとに発行されます。コネクションプールがリサイクルされ、接続し直すまで、SqlConnectionのインスタンスは同じセッショントレースIDになります。

 

まとめ

 

もし、セッショントレースIDとサーバネーム、おおよその時間を用意し、Azure Developer サポートに電話すると、デバッグプロセスを早めることができ、貴重な時間を守ることができます。

SQL Azure Team Blog

SQL Azure Date and Time Functions – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

Transact-SQLには、SQL Serverのインスタンスが動作するコンピューターのOSに依存する値を返す多数の日付、時刻関数があります。MCS UK Solution Development Teamブログに、SQL Azureでそれらの使用方法が説明されています。
その記事は、「ここ」から読めます。

======

SQL AzureとOSに依存する時間関数

SQL Azure Date and Time Functions derived from the Operating System – MCS UK Solution Development Team – Site Home – MSDN Blogsを翻訳しています。

SQL Azureの時間関数は、全て基本的にUTCで動作し、サーバがホストデータセンターに関係無く同じ結果を返します。以下のクエリを、2010年5月19日12:06:06(UTC)、北ヨーロッパに干すとされているSQL Azureのインスタンスに対して実行したところ、以下のテーブルのような結果になりました。

クエリ

SELECT
SYSDATETIME() as SYSDATETIME,
SYSDATETIMEOFFSET() as SYSDATETIMEOFFSET,
SYSUTCDATETIME() as SYSUTCDATETIME,
CURRENT_TIMESTAMP as currenttimestamp,
GETDATE() as getdate,
GETUTCDATE() as getUTCdate;

 

実行結果

SYSDATETIME()

2010-05-19 12:06:04.2422123

SYSDATETIMEOFFSET()

2010-05-19 12:06:04.2422123 +00:00

SYSUTCDATETIME()

2010-05-19 12:06:04.2422123

CURRENT_TIMESTAMP

2010-05-19 12:06:04.250

GETDATE()

2010-05-19 12:06:04.250

GETUTCDATE()

2010-05-19 12:06:04.240

米国中北部、米国中西部、東南アジアにホストされているSQL Azureデータベースから同じ結果を返します。

SQL Azure Team Blog

Generating Scripts for SQL Azure – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL ServerからSQL Azureへ移行する時、最初のステップは、SQL ServerのスキーマからSQL Azureへ移行するためのスクリプトを生成することです。SQL Server Management Studio 2008 R2に、新たに追加されたSQL Azureをターゲットに設定する拡張設定を使用することで、簡単に生成できます。
ステップバイステップで設定方法を説明します。

1) SQL Server Management Studio 2008 R2を開きます。

2) 転送したいデータベースを含むSQL Serverに接続します。

3) データベース上で右クリックし、[タスク]→[スクリプトの生成]を選択します。

1

 

4) スクリプトの生成とパブリッシュ ダイアログを開きます。 次へボタンをクリックし、説明ウィザードを飛ばします。

5) オブジェクトの選択ページが開きます。

 

2

 

6) データベース全体とすべてのデータベースオブジェクトのスクリプトを作成を選択し、「次へ」ボタンを選択します。

7) スクリプト作成オプションの設定ウィザードページが開きます。

 

3

8) 新しいクエリウィンドウに保存を選択し、詳細設定ボタンをクリックします。スクリプト作成の詳細オプションダイアログが開きます。

 

4

 

9) データベースエンジンの種類に対応したスクリプトオプションが表示されるまでスクロールを下げます。そのオプションのドロップダウンリストからSQL Azure データベースを選択します。「OK」ボタンを押します。

10) 次へボタンをクリックします。

11) 次へボタンをクリックし、概要ページを飛ばします。

12) スクリプトの保存またはパブリッシュダイアログで、データベースがクエリ化され、完了をクリックできるようになり、クリックするとクエリウィンドウにSQL Azureで使用できるクエリが表示されます。

13) This new query window in SQL Server Management Studio will automatically be connected the source SQL Server.

14) クエリウィンドウで右クリックし、メニューから[接続]→[接続の変更]を選択します。

 

5

15) 接続するSQL Azure サーバを設定します。オプションボタンを使用して、データベースを選択することができます。

 

6

 

16) SQL Server Management Studio で生成したスクリプトを実行し、SQL Azureにスキーマを作成します。

In order to use SSIS or BCP to transfer your SQL Server data to SQL Azure you need to have the schema is place on SQL Azure including your clustered indexes. クラスターインデックスを含んだSQL Azure上のスキーマに、SQL ServerからSQL Azureにデータを転送するのに、SSISまたはBCPを使用します。他のデータのアップロードを行うオプションとしては、スクリプトの保存またはパブリッシュダイアログで設定を変更しデータの生成を行う方法もあります。INSERT文が、スクリプトに追加されます。スクリプトのサイズが膨大になりますので、小さなデータベース限定の方法となりますが。

SQL Azure Team Blog

SQL Azureのテーブルにデータを追加するには、クラスター化インデックスが必要です。クラスター化インデックスが無いテーブルにデータを追加しようとすると、エラーが発生しデータを追加することができません。SQL Serverには、そのような制限はありません。

なぜ、SQL Azureには、そのような制限があるのでしょうか。