オンプレミス Analysis Services 表形式モデルに行レベル セキュリティを実装する

このチュートリアルでは、サンプル セマンティック モデルを使用して以下の手順に従い、オンプレミス "Analysis Services 表形式モデル" で行レベルのセキュリティを実装し、それを Power BI レポートで使用する方法を示します。

  • AdventureworksDW2012 データベースに新しいセキュリティ テーブルを作成する
  • 必要なファクト テーブルとディメンション テーブルを持つ表形式モデルを作成する
  • ユーザー ロールとアクセス許可を定義する
  • モデルを Analysis Services 表形式 インスタンスにデプロイする
  • レポートにアクセスするユーザーに合ったデータを表示する Power BI Desktop レポートをビルドする
  • レポートを Power BI サービスにデプロイする
  • レポートに基づいて新しいダッシュボードを作成する
  • 同僚とダッシュボードを共有する

このチュートリアルでは AdventureworksDW2012 データベースが必要です。

タスク 1:ユーザーのセキュリティ テーブルを作成し、データのリレーションシップを定義する

"SQL Server Analysis Services (SSAS) 表形式" モデルを使用して、行レベルの動的なセキュリティを定義する方法を説明する多くの記事を見つけることができます。

ここに示す手順では、AdventureworksDW2012 リレーショナル データベースを使用する必要があります。

  1. AdventureworksDW2012 では、以下に示すように DimUserSecurity テーブルを作成します。 SQL Server Management Studio (SSMS) を使用して、テーブルを作成することができます。

    Create DimUserSecurity table

  2. テーブルを作成して保存したら、次に示すように、DimUserSecurity テーブルの SalesTerritoryID 列と DimSalesTerritory テーブルの SalesTerritoryKey 列の間に関係を構築する必要があります。

    SSMS で、 [DimUserSecurity] を右クリックし、 [設計] を選択します。 その後、 [テーブル デザイナー][リレーションシップ] の順に選択します。完了したら、テーブルを保存します。

    Foreign Key Relationships

  3. ユーザーをテーブルに追加します。 [DimUserSecurity] を右クリックし、 [上位 200 行の編集] を選択します。 ユーザーを追加すると、DimUserSecurity テーブルは、次の例のようになります。

    DimUserSecurity table with example users

    これらのユーザーは以降のタスクで表示されます。

  4. 次に、DimSalesTerritory テーブルで "内部結合" を行います。このテーブルには、ユーザーに関連付けられている地域の詳細が示されます。 ここでは、SQL コードで内部結合を行います。図は、その後、テーブルがどのように表示されるかを示しています。

    select b.SalesTerritoryCountry, b.SalesTerritoryRegion, a.EmployeeID, a.FirstName, a.LastName, a.UserName from [dbo].[DimUserSecurity] as a join [dbo].[DimSalesTerritory] as b on a.[SalesTerritoryID] = b.[SalesTerritoryKey]
    

    手順 2 でリレーションシップを作成したことにより、結合されたテーブルには、販売地域ごとの担当者が示されます。 たとえば、Rita Santos は "オーストラリア" の担当であることがわかります。

タスク 2:ファクト テーブルとディメンション テーブルを持つ表形式モデルを作成する

リレーショナル データ ウェアハウスが準備できたら、表形式モデルを定義する必要があります。 モデルの作成には、SQL Server Data Tools (SSDT) を使用することができます。 詳細については、「新しいテーブル モデル プロジェクトの作成」を参照してください。

  1. 次に示すように、モデルに必要なすべてのテーブルをインポートします。

    Imported SQL Server for use with data tools

  2. 必要なテーブルをインポートしたら、読み取りアクセス許可を持つ SalesTerritoryUsers というロールを定義する必要があります。 SQL Server Data Tools で [モデル] メニューを選択してから、 [ロール] を選びます。 [ロール マネージャー] で、 [新規] を選択します。

  3. [ロール マネージャー][メンバー] で、タスク 1DimUserSecurity テーブルに定義したユーザーを追加します。

    Add users in Role Manager

  4. 次に、下図に示すように、 [行フィルター] タブで、DimSalesTerritory テーブルと DimUserSecurity テーブルの両方に適した関数を追加します。

    Add functions to Row Filters

  5. LOOKUPVALUE 関数は、Windows ユーザー名が、USERNAME 関数で返された名前と一致する列の値を返します。 これで、LOOKUPVALUE で返された値が、同じテーブルまたは関連テーブルの値と一致する列にクエリを制限することができます。 [DAX フィルター] 列に、次の数式を入力します。

        =DimSalesTerritory[SalesTerritoryKey]=LOOKUPVALUE(DimUserSecurity[SalesTerritoryID], DimUserSecurity[UserName], USERNAME(), DimUserSecurity[SalesTerritoryID], DimSalesTerritory[SalesTerritoryKey])
    

    この数式の LOOKUPVALUE は、DimUserSecurity[UserName] が現在ログオンしている Windows ユーザー名と同じで、DimUserSecurity[SalesTerritoryID]DimSalesTerritory[SalesTerritoryKey] と同じである DimUserSecurity[SalesTerritoryID] 列のすべての値を返します。

    重要

    行レベルのセキュリティを使用している場合、DAX 関数 USERELATIONSHIP はサポートされません。

    SalesTerritoryKeyLOOKUPVALUE で返される一連の販売地域を使用して、DimSalesTerritoryに表示される行を制限します。 SalesTerritoryKey の値が、LOOKUPVALUE 関数で返される ID に含まれる行のみが表示されます。

  6. DimUserSecurity テーブルでは、 [DAX フィルター] 列に、次の数式を追加します。

        =FALSE()
    

    この数式は、すべての列が false に解決することを指定します。これは、DimUserSecurity テーブルの列に対してクエリを実行できないことを意味します。

この時点で、モデルを処理してデプロイする必要があります。 詳細については、デプロイに関するページを参照してください。

タスク 3:オンプレミス データ ゲートウェイ内のデータ ソースを追加する

表形式モデルがデプロイされ、使用できるようになったら、Analysis Services 表形式サーバーへのデータ ソース接続を追加する必要があります。

  1. Power BI サービスからオンプレミスの分析サービスにアクセスできるようにするには、使用している環境にオンプレミス データ ゲートウェイがインストールされ、構成されている必要があります。

  2. ゲートウェイを正しく構成したら、Analysis Services 表形式インスタンス用のデータ ソース接続を作成する必要があります。 詳細については、「データ ソースの管理 - Analysis Services」を参照してください。

    Create data source connection

この手順が完了すると、ゲートウェイは構成され、オンプレミスの Analysis Services データ ソースと対話することができます。

タスク 4:Power BI Desktop を使用して Analysis Services 表形式モデルに基づくレポートを作成する

  1. Power BI Desktop を起動して、 [データの取得][データベース] の順に選択します。

  2. データ ソース リストから、 [SQL Server Analysis Services データベース] を選択して、 [接続] を選びます。

    Connect to SQL Server Analysis Services Database

  3. Analysis Services 表形式インスタンスの詳細を入力して、 [ライブ接続] を選択します。 [OK] を選択します。

    Analysis Services details

    Power BI では、動的セキュリティはライブ接続でのみ機能します。

  4. Analysis Services インスタンスにデプロイされたモデルがあることがわかります。 該当するモデルを選択してから、 [OK] を選びます。

    これで、Power BI Desktop で、 [フィールド] ウィンドウのキャンバスの右側に使用可能なフィールドがすべて表示されます。

  5. [フィールド] ウィンドウで、FactInternetSales テーブルから SalesAmount メジャーを選択し、SalesTerritory テーブルから SalesTerritoryRegion ディメンションを選択します。

  6. このレポートをシンプルなものにしておくために、この時点では列を追加しません。 データをよりわかりやすくするために、視覚化をドーナツ グラフに変更します。

    Donut chart visualization

  7. レポートの準備ができたら、Power BI ポータルに直接発行できます。 Power BI Desktop の [ホーム] リボンで、 [発行] を選択します。

タスク 5:ダッシュボードを作成して共有する

レポートを作成し、それを Power BI サービスに発行しました。 これで、前の手順で作成された例を使用して、モデル セキュリティ シナリオを示すことができます。

ロールが "販売マネージャー" であるユーザー Grace は、あらゆる販売地域からのデータを表示できます。 Grace はこのレポートを作成して、Power BI サービスに発行します。 このレポートの作成は前のタスクで完了しています。

Grace がレポートを発行したら、次の手順では、そのレポートに基づいて、Power BI サービスで TabularDynamicSec という名前のダッシュボードを作成します。 次の図で、Grace がすべての販売地域に対応するデータを表示できることがわかります。

Power BI service dashboard

次に、Grace は、オーストラリア地域の販売担当である Rita という同僚とダッシュボードを共有します。

Share a Power BI dashboard

Rita が Power BI サービスにログインして、Grace が作成した共有ダッシュボードを表示すると、オーストラリア地域の販売のみが表示されます。

おめでとうございます。 Power BI サービスには、オンプレミスの Analysis Services 表形式モデルで定義された動的な行レベルのセキュリティが表示されます。 Power BI は EffectiveUserName プロパティを使用して、現在の Power BI ユーザーの資格情報をオンプレミス データ ソースに送信し、クエリを実行します。

タスク 6:バックグラウンドでの動作を理解する

このタスクでは、SQL Server プロファイラーを使い慣れていることを前提とします。これは、オンプレミスの SSAS 表形式インスタンスで SQL Server プロファイラー トレースをキャプチャする必要があるためです。

ユーザー (Rita) が Power BI サービスのダッシュボードにアクセスすると、すぐにセッションが初期化されます。 salesterritoryusers 役割は、<EffectiveUserName>rita@contoso.com</EffectiveUserName> などの有効なユーザー名ですぐに有効になることがわかります。

       <PropertyList><Catalog>DefinedSalesTabular</Catalog><Timeout>600</Timeout><Content>SchemaData</Content><Format>Tabular</Format><AxisFormat>TupleFormat</AxisFormat><BeginRange>-1</BeginRange><EndRange>-1</EndRange><ShowHiddenCubes>false</ShowHiddenCubes><VisualMode>0</VisualMode><DbpropMsmdFlattened2>true</DbpropMsmdFlattened2><SspropInitAppName>PowerBI</SspropInitAppName><SecuredCellValue>0</SecuredCellValue><ImpactAnalysis>false</ImpactAnalysis><SQLQueryMode>Calculated</SQLQueryMode><ClientProcessID>6408</ClientProcessID><Cube>Model</Cube><ReturnCellProperties>true</ReturnCellProperties><CommitTimeout>0</CommitTimeout><ForceCommitTimeout>0</ForceCommitTimeout><ExecutionMode>Execute</ExecutionMode><RealTimeOlap>false</RealTimeOlap><MdxMissingMemberMode>Default</MdxMissingMemberMode><DisablePrefetchFacts>false</DisablePrefetchFacts><UpdateIsolationLevel>2</UpdateIsolationLevel><DbpropMsmdOptimizeResponse>0</DbpropMsmdOptimizeResponse><ResponseEncoding>Default</ResponseEncoding><DirectQueryMode>Default</DirectQueryMode><DbpropMsmdActivityID>4ea2a372-dd2f-4edd-a8ca-1b909b4165b5</DbpropMsmdActivityID><DbpropMsmdRequestID>2313cf77-b881-015d-e6da-eda9846d42db</DbpropMsmdRequestID><LocaleIdentifier>1033</LocaleIdentifier><EffectiveUserName>rita@contoso.com</EffectiveUserName></PropertyList>

有効なユーザー名要求に基づいて、Analysis Services では、ローカルの Active Directory のクエリを実行した後、要求を実際の contoso\rita 資格情報に変換します。 Analysis Services で資格情報が取得されると、Analysis Services によって、ユーザーが表示とアクセスのアクセス許可を持っているデータが返されます。

ダッシュボードで他のアクティビティが発生すると、SQL プロファイラーで、Analysis Services 表形式モデルに DAX クエリとして戻される特定のクエリが表示されます。 たとえば、Rita がダッシュボードから基になるレポートに移動すると、次のクエリが発生します。

DAX query comes back to Analysis Services model

また、レポートのデータを取り込むために以下のような DAX クエリが実行されることがわかります。

EVALUATE
  ROW(
    "SumEmployeeKey", CALCULATE(SUM(Employee[EmployeeKey]))
  )

<PropertyList xmlns="urn:schemas-microsoft-com:xml-analysis">``
          <Catalog>DefinedSalesTabular</Catalog>
          <Cube>Model</Cube>
          <SspropInitAppName>PowerBI</SspropInitAppName>
          <EffectiveUserName>rita@contoso.com</EffectiveUserName>
          <LocaleIdentifier>1033</LocaleIdentifier>
          <ClientProcessID>6408</ClientProcessID>
          <Format>Tabular</Format>
          <Content>SchemaData</Content>
          <Timeout>600</Timeout>
          <DbpropMsmdRequestID>8510d758-f07b-a025-8fb3-a0540189ff79</DbpropMsmdRequestID>
          <DbPropMsmdActivityID>f2dbe8a3-ef51-4d70-a879-5f02a502b2c3</DbPropMsmdActivityID>
          <ReturnCellProperties>true</ReturnCellProperties>
          <DbpropMsmdFlattened2>true</DbpropMsmdFlattened2>
          <DbpropMsmdActivityID>f2dbe8a3-ef51-4d70-a879-5f02a502b2c3</DbpropMsmdActivityID>
        </PropertyList>

考慮事項

  • Power BI でオンプレミスの行レベル セキュリティを使用できるのは、ライブ接続の場合のみです。

  • モデルの処理後にデータに加えられる変更は、ユーザーが Power BI サービスからライブ接続を使用してレポートにアクセスするとただちに使用できるようになります。