Contained Database の照合順序
前述の照合順序に関する問題は、まさにインスタンスとユーザーデータベース間の依存関係によって発生する問題です。しかし、Contained Databaseを使えばインスタンスの照合順序に依存しなくなるため、これらの問題が解決されます。
先ほどの環境 (インスタンスとデータベースの照合順序が異なる環境) でエラーとなった一時テーブルを使用するクエリを、Contained Databaseとして作成したデータベース上で実行してみましょう。今度はエラーにはなりません。
CREATE TABLE T1 (T1_txt nvarchar(max)) ; GO CREATE TABLE #T2 (T2_txt nvarchar(max)); GO SELECT T1_txt, T2_txt FROM T1 JOIN #T2 ON T1.T1_txt = #T2.T2_txt ;
この結果から想像がつくと思いますが、Contained Databaseにおいては一時テーブルの照合順序にもデータベースの照合順序が適用されます。もはやここにインスタンスとの依存関係はありません。
Contained Databaseでは、このようなインスタンスの照合順序に依存しない動作を実現するために、新たに catalog collationというものを実装しました。Catalog collationとは、SQL Serverの全てのメタデータ と言語要素 (例えば変数名や、gotoラベルなど) に使用される照合順序です。
Catalog collationは固定でLatin1_General_100_CI_AS_WS_KS_SCと決まっています。これを変更することはできません。Contained Databaseにおいて、データベースの照合順序は、通常のデータベースと同じように任意の照合順序を設定できますが、これはユーザー データに対してのみ使用される照合順序となります。それ以外の要素についてはcatalog collationが適用されます。
このcatalog collationの一貫性は、前述の変数バインドの問題も解決します。変数名の照合順序はインスタンスの照合順序に左右されることなく固定のcatalog collationが使用されるからです。
Catalog collationが実装されたことで、Denaliでは新たにCATALOG_DEFAULTというキーワードがCOLLAT 句で指定できるようになります。CATALOG_DEFAULTキーワードは、データベースのメタデータの照合順序を表すキーワードです。
CATALOG_DEFAULTは、通常のデータベースの場合はデータベースの照合順序を表し、Contained Databaseにおいてはcatalog collationを表します。
通常のデータベースにおけるメタデータの照合順序は、必ずデータベースの照合順序と同じなので、CATALOG_DEFAULTは、データベースの照合順序です。
一方で、Contained Databaseの場合、CATALOG_DEFAULTはcatalog collationなので、Latin1_General_100_CI_AS_WS_KS_SCです。データベースの照合順序はユーザーが任意で変更可能なので、CATALOG_DEFAULTがデータベースの照合順序と必ずしも一致するとは限りません。
Contained Databaseと通常のデータベースの照合順序に関する動作の違いは、まとめると以下のようになります。
Contained Databaseにおける照合順序はDATABASE_DEFAULTか、CATALOG_DEFAULTとなっており、インスタンスやtempdbの照合順序に依存していないことがわかります。