不明なメンバと NULL 処理のプロパティの定義
Microsoft SQL Server 2005 Analysis Services (SSAS) がディメンションを処理するときに、ディメンションの属性を生成しているのは、データ ソース ビューのテーブルまたはビュー内の基になる列の各値です。Analysis Services での処理中に NULL 値があった場合は、既定によって NULL は数値列ではゼロに、文字列型の列では空の文字列に変換され、エラーはスローされません。このような既定を変更したり、基礎的なリレーショナル データ ウェアハウスに固有の抽出、変換、読み込みプロセスがあればそれらを使用して NULL 値を変換したりできます。また、Analysis Service を使用し、ディメンションに対しては UnknownMember プロパティと UnknownMemberName プロパティ、ディメンションのキー属性に対しては NullProcessing プロパティという 3 つのプロパティを構成して、指定した値に NULL 値を変換することもできます。
ディメンション ウィザードおよびキューブ ウィザードでは、ディメンションのキー属性が NULL 値を許容するかどうか、またはスノーフレーク ディメンションのルート属性が NULL 値を許容する列に基づいているかどうかを基準にして、これらのプロパティを適切に有効化します。この場合では、キー属性の NullProcessing プロパティは UnknownMember に設定され、UnknownMember プロパティは Visible に設定されます。
メモ : |
---|
不明なメンバの既定値は Unkown です。UnknownMemberName プロパティの値を設定することにより、異なる値を指定できます。 |
ただし、このチュートリアルで Product ディメンションに対して行っているようにスノーフレーク ディメンションを段階的に構築する場合、またはディメンション デザイナを使用してディメンションを定義してこれらの既存のディメンションをキューブに組み込む場合は、UnknownMember プロパティおよび NullProcessing プロパティを手動で設定する必要があります。
次の実習で説明するように、Analysis Services によってスノーフレーク ディメンションを処理する場合は、特定のプロパティの設定を変更していない限り、スノーフレーク テーブルにリンクする列の値が NULL である属性メンバは削除されます。NULL 値が検出されてもエラーは発生せず、既定では、Analysis Services はこの種のエラーを無視します。NullKeyCovertedToUnknown プロパティの既定の設定が IgnoreError であるためです。Analysis Services は 2 つのスノーフレーク テーブル間で内部結合を実行するので、NULL 値を持つ属性メンバを削除します。
この状況で Analysis Services に実行させる処理の内容は、次の手順で制御します。
- ディメンションの UnknownMember プロパティを有効にする
- ディメンションに UnknownMemberName プロパティの値を指定する
- ディメンションの属性を適切にリンクする属性リレーションシップを設定する
- スノーフレーク テーブルを結合しているキー列に対し、カスタム エラー処理を定義する
このトピックの実習では、Adventure Works DW のデータ ソース ビューに追加するスノーフレーク テーブルから、製品カテゴリおよび製品サブカテゴリの属性を取得し、それらの属性を Product ディメンションに追加します。次に、Product ディメンションの UnknownMember プロパティを有効にします。UnknownMemberName プロパティの値には Assembly Components を指定し、Subcategory 属性と Category 属性を製品名の属性に関連付けます。最後に、スノーフレーク テーブルを結合しているメンバ キー属性に対し、カスタム エラー処理を定義します。
メモ : |
---|
キューブ ウィザードを使用して Analysis Services Tutorial キューブを最初に定義したときに Subcategory 属性と Category 属性を追加していれば、これらの手順は自動的に実行されます。 |
Product ディメンションでのエラー処理のプロパティと不明なメンバのプロパティの確認
Product ディメンションで、エラー処理のプロパティと不明なメンバのプロパティを確認するには
Product ディメンションのディメンション デザイナに切り替え、[ディメンション構造] タブをクリックします。次に、[属性] ペインで [Product] をクリックします。
ディメンション自体のプロパティを表示し、修正できるようになりました。
[プロパティ] ウィンドウで、UnknownMember プロパティと UnknownMemberName プロパティを確認します。
UnknownMember プロパティは有効になっていません。このプロパティの値が Visible または Hidden ではなく、None に設定されているためです。また、UnknownMemberName プロパティには名前が指定されていません。
[プロパティ] ウィンドウで、ErrorConfiguration プロパティのセルをクリックして、[(カスタム)] を選択します。次に、ErrorConfiguration プロパティ コレクションを展開します。
ErrorConfiguration プロパティを [(Custom)] に設定すると、既定のエラー構成設定を表示できます。既定のエラー構成設定は変更されていません。
キーおよび NULL キーについて、エラーの構成のプロパティを確認します。変更はしないでください。
NULL キーが不明なメンバに変換される際に、この変換に関連する処理エラーが無視されていることがわかります (これが既定の動作です)。
次の図は、ErrorConfiguration プロパティ コレクションのプロパティ設定を示しています。
[ブラウザ] タブをクリックし、[階層] ボックスで [Product Model Lines] が選択されていることを確認します。[All Products] を展開します。
Product Line レベルには 5 つのメンバが存在します。
[Components] を展開します。Model Name レベルのメンバのうち、ラベルが付いていないメンバを展開します。
次の図のように、このレベルには、アジャスタブル レース (Adjustable Race) など、他の部品を組み立てるときに使用するアセンブリ部品が含まれています。
スノーフレーク テーブルおよび Product Category ユーザー定義階層の属性の定義
スノーフレーク テーブルおよび Product Category ユーザー定義階層の属性を定義するには
Adventure Works DW データ ソース ビューのデータ ソース ビュー デザイナを開き、[ダイアグラム オーガナイザ] ペインで [Reseller Sales] を選択します。次に、Business Intelligence Development Studio の [データ ソース ビュー] メニューから [テーブルの追加と削除] をクリックします。
[テーブルの追加と削除] ダイアログ ボックスが開きます。
[含まれているオブジェクト] ボックスの一覧で [dbo.DimProduct] をクリックします。次に、[関連テーブルの追加] をクリックします。
[含まれているオブジェクト] の一覧に dbo.DimProductSubcategory テーブルが追加されます。
既定では、最後に追加した dbo.DimProductSubcategory テーブルが選択されます。この状態で、[関連テーブルの追加] をもう一度クリックします。
[含まれているオブジェクト] の一覧に dbo.DimProductCategory テーブルが追加されます。
[OK] をクリックします。
BI Development Studio の [書式] メニューで [自動レイアウト] をポイントし、[ダイアグラム] をクリックします。
次の図のように、dbo.DimProductSubcategory テーブルと dbo.DimProductCategory テーブルは互いにリンクしています。また、Product テーブルを介して ResellerSales テーブルにもリンクしてます。
Product ディメンションのディメンション デザイナに切り替え、[ディメンション構造] タブをクリックします。
[データ ソース ビュー] ペイン内を右クリックし、[すべてのテーブルを表示] をクリックします。
[データ ソース ビュー] ペインで、DimProductCategory テーブルを探します。次に、このテーブルの ProductCategoryKey を右クリックし、[列から新しい属性を作成] をクリックします。
[属性] ペインで、この新しい属性の名前を「Category」に変更します。
[プロパティ] ウィンドウで、NameColumn プロパティのセルをクリックし、[(新規)] を選択します。[オブジェクトのバインド] ダイアログ ボックスが表示されます。[基になるテーブル] フィールドで [DimProductCategory] を選択し、[基になる列] フィールドで [EnglishProductCategoryName] を選択して、[OK] をクリックします。
[データ ソース ビュー] ペインで、DimProductSubcategory テーブルを探します。このテーブルの ProductSubcategoryKey を右クリックし、[列から新しい属性を作成] をクリックします。
[属性] ペインで、この新しい属性の名前を「Subcategory」に変更します。
[プロパティ] ウィンドウで、NameColumn プロパティのセルをクリックし、[(新規)] を選択します。[オブジェクトのバインド] ダイアログ ボックスが表示されます。[基になるテーブル] フィールドで [DimProductSubcategory] を選択し、[基になる列] フィールドで [EnglishProductSubcategoryName] を選択して、[OK] をクリックします。
Product Categories という名前の新しいユーザー定義階層を作成します。この階層の最上位レベルに Category レベルを配置し、その下に Subcategory レベル、さらにその下に Product Name レベルを配置します。
Product Categories ユーザー定義階層の AllMemberName の値として、「All Products」と入力します。
Product ディメンションのユーザー定義階層の表示
Product ディメンションのユーザー定義階層を表示するには
Product ディメンションのディメンション デザイナで、[ディメンションの構造] タブのツール バーにある [処理] をクリックします。
[はい] をクリックして、プロジェクトを作成し、配置します。次に、[実行] をクリックして、Product ディメンションを処理します。
処理が正常に完了したら、[処理の進行状況] ダイアログ ボックスで [ディメンション 'Product' の処理が正常に完了しました] を展開し、[ディメンション属性 'Product Name' の処理が正常に完了しました] を展開します。次に、[SQL クエリ数 1] を展開します。
SELECT DISTINCT クエリをクリックし、[詳細表示] をクリックします。
SELECT DISTINCT 句に WHERE 句が追加されています。次の図のように、この WHERE 句は、値を持たない製品を ProductSubcategoryKey から削除します。
[閉じる] を 3 回クリックし、処理中のダイアログ ボックスをすべて閉じます。
Product ディメンションのディメンション デザイナで、[ブラウザ] タブをクリックします。次に、[再接続] をクリックします。
[階層] ボックスの一覧に [Product Model Lines] が表示されていることを確認し、[All Products]、[Components] の順に展開します。
次の図のように、SELECT DISTINCT ステートメントの WHERE 句により、アセンブリ部品が何も表示されなくなりました。
[階層] ボックスの一覧から [Product Categories] を選択し、[All Products]、[Components] の順に展開します。
アセンブリ部品は何も表示されません。
前の実習で説明した動作を変更するには、Product ディメンションの UnknownMember プロパティを有効にし、UnknownMemberName の値を設定します。次に、Subcategory 属性と Model Name 属性の NullProcessing プロパティを UnknownMember に設定します。最後に、Category 属性を Subcategory 属性の関連する属性として定義し、Product Line 属性を Model Name 属性の関連する属性として定義します。以上の操作により、Analysis Services では、SubcategoryKey 列に値を持たないそれぞれの製品について、UnknownMemberName の値が使用されるようになります。次の実習でそれを確認します。
不明なメンバの有効化、属性リレーションシップの定義、および NULL のカスタム処理プロパティの指定
不明なメンバを有効にし、属性リレーションシップを定義して、NULL のカスタム処理プロパティを指定するには
Product ディメンションのディメンション デザイナで、[ディメンションの構造] タブをクリックします。
[プロパティ] ウィンドウで、Product ディメンションの UnknownMember プロパティを Visible に設定します。次に、このディメンションの UnknownMemberName プロパティのセルをクリックし、値として「Assembly Components」と入力します。
UnknownMember プロパティを Visible または Hidden に変更すると、ディメンションの [UnknownMember] プロパティが有効になります。
[属性] ペインで次の属性を展開します。
- Product Name
- Subcategory
- Model Name
Product Line は Model Name 属性に関連付けられており、それによって間接的に Product Name キー属性にリンクされています。Subcategory 属性に定義されている属性リレーションシップはありません。Category 属性は、キー属性から直接 Product Name 属性にリンクしています。
Product Name 属性の Category 属性リレーションシップを、Subcategory 属性までドラッグします。
Category 属性が、Subcategory 属性を介してファクト テーブルの行にリンクされました。その結果、Subcategory 属性は、Product Name 属性を介してファクト テーブルにリンクされています。
[属性] ペインで [Subcategory] を選択します。次に、[プロパティ] ウィンドウで、KeyColumns プロパティの参照ボタン ([...]) をクリックします。
[DataItem コレクション エディタ] ダイアログ ボックスで、次の図のように NullProcessing プロパティを UnknownMember に変更します。
[OK] をクリックします。
[属性] ペインで [Model Name] を選択します。次に、[プロパティ] ウィンドウで、KeyColumns プロパティの参照ボタン ([...]) をクリックします。
[DataItem コレクション エディタ] ダイアログ ボックスで、NullProcessing プロパティを UnknownMember に変更し、[OK] をクリックします。
この 3 つの変更により、処理中に Analysis Services が Subcategory 属性または Model Name 属性に NULL 値を検出すると、不明なメンバの値がキー値として働き、ユーザー定義階層が適切に作成されます。
Product ディメンションの再表示
Product ディメンションを表示するには
[ビルド] メニューの [Analysis Services Tutorial の配置] をクリックします。
配置が正常に完了したら、Product ディメンションのディメンション デザイナで [ブラウザ] タブをクリックし、[再接続] をクリックします。
[階層] ボックスで [Product Categories] が選択されていることを確認し、[All Products] を展開します。
Category レベルの新しいメンバとして Assembly Components が表示されています。
Category レベルの Assembly Components メンバを展開し、Subcategory レベルの Assembly Components メンバを展開します。
次の図のように、Product Name レベルにアセンブリ部品が表示されるようになりました。
[階層] ボックスの一覧から [Product Model Lines] を選択し、[All Products] を展開します。次に、Product Line レベルの Assembly Components メンバを展開し、Model Name レベルの Assembly Components メンバを展開します。
すべてのアセンブリ部品が Product Name レベルに表示されるようになりました。
メモ : |
---|
レッスン 4 までの操作内容が反映されたプロジェクトを使用する場合は、サンプルの最新版をダウンロードしてインストールしてください。詳細については、「サンプルのインストール」の「サンプルの最新版の入手」を参照してください。 |