SQL Azureガイドラインと制限事項
概要
MSDNの「Guidelines and Limitations (SQL Azure Database)」を元に作成したSQL Azureのガイドラインと制限事項のまとめです。
現在、作成途中
SQL Azureの最大値
| 項目 | 値 | 
|---|---|
| データベース数 | 最大5個(MasterDBを含むのでユーザDBとして新規に作成できるのは最大4個) | 
| ユーザ割当領域 | 現在のリリースでは、1GB(Web Edition)か10GB(Business Edition)の2種類 | 
SQL Azureの照合順序
SQL Azureの既定の照合順序は、「SQL_LATIN1_GENERAL_CP1_CI_AS」です。
- LATIN1_GENERAL : English(United States)
 - CP1 : 1252コードページ
 - CI : 大文字小文字の区別なし
 - AS : アクセントの区別あり
 
SQL Azureでは、サーバ、データベースレベルでの照合順序は設定できない。SQL Azureで照合順序を設定するには、列レベルかエクスプレッションレベルで設定します。詳細はSQL Server OnlineBooksのCOLLATE (Transact-SQL)を参照してください。
接続環境
- 接続はTCP/IPコネクションのみ
 - ポート1433のみの提供なのでクライアントPCのFireWallで1433を空ける必要がある
 - SQL Azure FireWallで接続可能IP範囲を指定して空けなければならない
 - SQL Azureへの接続は暗号化されてなければならない
 
認証
- SQL Server認証のみの提供でWindows 認証は使用できない
 - パフォーマンス上の理由で、SQL Azureのパスワードを変更しても、すぐには接続が再認証されない
 - 最後に認証してから60分が経過した場合、再認証が行われる
- その間にパスワードを変更していると、リクエストに失敗し接続も閉じてしまう
 
 
ログインとユーザ
SQL Azureでログインとユーザを管理するとき以下の制限を受ける
- サーバプロビジョニングを行っている間、SQL Serverと同様にsaログインで初期プリンシパルサーバレベルのログインを作成する。(詳細は、SQL Azureプロビジョニングモデルを参照)このサーバプリシンパルレベルに関連付けられたログインのみ、パスワードの変更を行うことができる。masterデータベースへのアクセスするためには、masterレベルでユーザアカウントをログイン毎にマッピングさせなければならない。masterデータベースに関連付けられたサーバレベルのプリンシパルログインのデータベースユーザは変更したり削除を行うことはできない。このログインは、サーバレベルのdbmanagerとloginmanagerの2つの役割のメンバーではありませんが、データベースユーザは、この2つの役割が許可する権限をすべて持ちます。
 - 全てのログインは、既定の言語がUS-Englishで、接続文字列で言語を指定することはできません。既定でmasterデータベースに接続します。
 - ログインのCREATE/ALTER/DROP、データベースのCREATE/DROP文の実行をするとき、masterデータベースに接続しなければなりません。
 - ADO.NETアプリケーションでログインのCREATE/ALTER/DROP、データベースのCREATE/DROP文の実行をするとき、パラメータライズドクエリは許可されていません。詳細は、コマンドとパラメータを確認してください。
 - ログインのCREATE/ALTER/DROP、データベースのCREATE/DROP文の実行をするとき、SQL バッチでは単一文でなければなりません。複数使用しているとエラーになります。
 
IF EXISTS (SELECT [name]
	FROM [sys].[databases]
	WHERE [name] = N'database_name')
	DROP DATABASE [database_name];
	go
上記SQLは、データベースが存在するかどうかを確認し、存在する場合にはデータベースを削除する為のものです。このSQLは失敗します。DROP DATABASE文は単一文でなければなりませんが、SELECT文があるため複数文となっているため失敗します。
- CREATE USER文は、FOR/FROMログインオプションを使用している場合、単一文でなければなりません。
 - ALTER USER文は、LOGINオプションを使用している場合、単一文でなければなりません。
 - サーバレベルプリンシパルログインとdbmangerロールのメンバーにしか、CREATE DATABASEとDROP DATABASEを行えない。
 - サーバレベルプリンシパルログインとloginmangerロールのメンバーにしか、CREATE LOGIN、ALTER LOGIN、DROP LOGINを実行できない。
 - masterデータベースにアクセスするには、データベースユーザをmasterデータベースにマッピングしなければならない
 - 現在のバージョンでは、データベースオーナーが別のデータベースのユーザを追加したり削除したり、役割を追加削除を行おうとするとエラーが発生する。「User or role 'Name' does not exist in this database」これは、DBオーナーからユーザが見えない為に起こります。解決するにはDBオーナーに「VIEW DEFINITION」権限を付与します。
 
接続制限
SQL Azureは共用環境で運用されており、すべてのユーザに素晴らしい体験を提供するため以下の場合は接続を閉じる場合がある。
	現在のバージョンでは、アイドル接続と長いクエリやトランザクションは5分後にクローズします。
- 過度のリソース利用
 - 長時間動いているクエリ
 - 長い単一トランザクション
 - アイドル接続
 - サーバ障害でフェールオーバーが発生したとき
 
SQL Azureで発生するエラー
| エラー | 重要度 | 説明 | 
|---|---|---|
| 40197 | 16 | The service has encountered an error processing your request. Please try again. Error code %d. | 
| リクエストの途中でエラーが発生しました。再リクエストしてください。 | ||
| 40501 | 20 | The service is currently busy. Retry the request after 10 seconds. Code: %d. | 
| サービスがビジーです。10秒後に再リクエストしてください。 | ||
| 40544 | 20 | The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Code: %d | 
| 割り当てられたデータベース容量が一杯になりました。分割するか、データを削除するか、インデックスを破棄するか、参照専用にしてください。 | ||
| 40549 | 20 | Session is terminated. Reason: Long running transaction. | 
| セッションは終了しました:トランザクションが長すぎます | ||
| 40613 | 17 | Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing id of '%.*ls'. | 
| サーバ上のデータベースは現在提供されていません。後程、再接続してください。もし問題が続く場合は、カスタマサポートに問い合わせ、セッションのトレースIDを提供してください。 | 
SQL Azureアプリケーションでは、これらのエラーをキャッチしてリトライすることをお勧めします。エラーが発生した場合、再接続し、失敗したコマンドやクエリを再実行します。
現在のリリースでは、1GB(Web Edition)か10GB(Business 
	Edition)の2種類のデータベースサイズが提供されています。もしデータベース容量が最大サイズに達した場エラーコード40544を受け取ります。この時、データのInsertやUpdate、Indexの再構築、テーブルやストアドプロシージャ、ビュー、関数のようなデータベースオブジェクトを新たに作成することはできません。
	しかし、データの参照や削除、テーブルのTruncateや、テーブル・インデックスの削除はできます。
削除し、容量に空きが発生した場合、新しいデータを登録できるようになるまで15分前後のタイムラグが発生する可能性があります。