補足のレッスン-行フィルターを使用した動的なセキュリティの実装

適用対象:SQL Server 2016 以降 Analysis Services Azure Analysis Services Power BI Premium

この補足のレッスンでは、動的なセキュリティを実装する追加のロールを作成します。 動的なセキュリティは、現在ログオンしているユーザーのユーザー名またはログイン ID に基づく行レベルのセキュリティを提供します。 詳細は、ロール を参照してください。

動的なセキュリティを実装するには、データ ソースとしてのモデルへの接続を作成し、モデル オブジェクトとデータを参照できるユーザーの Windows ユーザー名を含むテーブルを、モデルに追加する必要があります。 このチュートリアルで作成するモデルは Adventure Works Corp. のコンテキスト内にありますが、このレッスンを完了するには、自分のドメインのユーザーが含まれているテーブルを追加する必要があります。 追加するユーザー名のパスワードは必要ありません。 EmployeeSecurity テーブルを作成するには、自分のドメインの小さなサンプルユーザーを使用して、貼り付け機能を使用し、Excel スプレッドシートから従業員データを貼り付けます。 実際のシナリオでは、モデルに追加するユーザー名が含まれたテーブルは通常、実際のデータベースのテーブル (たとえば、実際の dimEmployee テーブルなど) をデータ ソースとして使用します。

動的なセキュリティを実装するには、 USERNAME Function (DAX) および LOOKUPVALUE Function (DAX)という 2 つの新しい DAX 関数を使用します。 行フィルター式に適用されるこれらの関数は、新しいロールで定義されています。 数式は LOOKUPVALUE 関数を使用して EmployeeSecurity テーブルの値を指定し、その値を USERNAME 関数に渡します。この関数は、ログオンしているユーザーのユーザー名がこのロールに属することを指定します。 ユーザーは、ロールの行フィルターによって指定されたデータのみを参照できます。 このシナリオでは、販売担当者がインターネット上で自分の販売区域の売上データのみを参照できるように指定します。

この補足のレッスンを完了するには、一連の作業を行います。 この Adventure Works 表形式モデルのシナリオに固有の作業で、実際のシナリオに必ずしも適用されないものは、そのように記載されています。 各作業には、作業の目的を説明する追加情報が含まれています。

このレッスンの推定所要時間: 30 分

前提条件

この補足のレッスンのトピックは表形式モデルのチュートリアルの一部であり、順番に従って実行する必要があります。 この補足のレッスンの作業を実行する前に、前のレッスンをすべて完了している必要があります。

AW Internet Sales Tabular Model プロジェクトへの DimSalesTerritory テーブルの追加

この Adventure Works のシナリオの動的セキュリティを実装するには、2 つの追加テーブルをモデルに追加する必要があります。 最初に追加するテーブルは、同じ AdventureWorksDW データベースの (販売区域としての) dimSalesTerritory です。 後で、ログオンしているユーザーが参照できる特定のデータを定義する行フィルターを SalesTerritory テーブルに適用します。

DimSalesTerritory テーブルを追加するには

  1. SSDT で、[ モデル ] メニューをクリックし、[ 既存の接続] をクリックします。

  2. [既存の接続] ダイアログ ボックスで [Adventure Works DB from SQL] データ ソース接続が選択されていることを確認し、 [開く]をクリックします。

    [権限借用の資格情報] ダイアログ ボックスが表示された場合は、「レッスン 2: データの追加」で使用した権限借用の資格情報を入力します。

  3. [データのインポート方法の選択] ページで、 [インポートするデータをテーブルとビューの一覧から選択する] が選択されていることを確認し、 [次へ]をクリックします。

  4. [テーブルとビューの選択] ページで、 DimSalesTerritory テーブルをクリックします。

  5. [プレビューとフィルター]をクリックします。

  6. SalesTerritoryAlternateKey 列を選択解除して、 [OK]をクリックします。

  7. [テーブルとビューの選択] ページで、 [完了]をクリックします。

    新しいテーブルがモデル ワークスペースに追加されます。 ソースの DimSalesTerritory テーブルのオブジェクトおよびデータが AW Internet Sales Tabular Model にインポートされます。

  8. テーブルのインポートが完了したら、 [閉じる]をクリックします。

ユーザー名データを含むテーブルの追加

AdventureWorksDW サンプル データベース内の DimEmployee テーブルには AdventureWorks ドメインのユーザーが含まれており、それらのユーザー名はご使用の環境に存在しないため、組織の実在ユーザーから小人数 (3 人) のサンプルを含むテーブルをモデルに作成する必要があります。 その後、これらのユーザーを新しいロールにメンバーとして追加します。 サンプルのユーザー名のパスワードは不要ですが、自分のドメインの実際の Windows ユーザー名が必要になります。

EmployeeSecurity テーブルを追加するには

  1. Microsoft Excel を開き、新しいワークシートを作成します。

  2. ヘッダー行を含む次のテーブルをコピーし、ワークシートに貼り付けます。

      |EmployeeId|SalesTerritoryId|FirstName|LastName|LoginId|  
      |---------------|----------------------|--------------|-------------|------------|  
      |1|2|<user first name>|<user last name>|\<domain\username>|  
      |1|3|<user first name>|<user last name>|\<domain\username>|  
      |2|4|<user first name>|<user last name>|\<domain\username>|  
      |3|5|<user first name>|<user last name>|\<domain\username>|  
    
  3. 名、姓、および domain\username を組織の 3 人のユーザーの名前とログイン ID に置き換えます。 先頭の 2 つの行に、EmployeeId 1 の同じユーザーを配置します。 これは、このユーザーが 1 つ以上の販売区域に属していることを示します。 EmployeeId フィールドと SalesTerritoryId フィールドはそのままにします。

  4. ワークシートを SampleEmployee として保存します。

  5. ワークシートで、従業員データを含むすべてのセル (ヘッダーを含む) を選択し、選択したデータを右クリックして、[ コピー] をクリックします。

  6. SSDT で、[編集] メニューをクリックし、[貼り付け] をクリックします。

    [貼り付け] がグレー表示されている場合は、モデル デザイナー ウィンドウの任意のテーブルの任意の列をクリックし、もう一度操作を行います。

  7. [貼り付けプレビュー] ダイアログ ボックスの [テーブル名] に、「EmployeeSecurity」と入力します。

  8. [ 貼り付けるデータ] で、sampleemployee ワークシートのすべてのユーザーデータとヘッダーがデータに含まれていることを確認します。

  9. [先頭の行を列見出しとして使用する] がオンであることを確認し、[OK] をクリックします。

    SampleEmployee ワークシートからコピーした従業員データを含む、EmployeeSecurity という名前の新しいテーブルが作成されます。

FactInternetSales、DimGeography、および DimSalesTerritory テーブル間のリレーションシップの作成

FactInternetSales、DimGeography、および DimSalesTerritory テーブルはすべて、共通の列である SalesTerritoryId を含みます。 DimSalesTerritory テーブルの SalesTerritoryId 列には、販売区域ごとに異なる ID の値が含まれています。

FactInternetSales、DimGeography、および DimSalesTerritory テーブル間のリレーションシップを作成するには

  1. モデルデザイナーのダイアグラムビューのDimGeographyテーブルで、 SalesTerritoryId列をクリックしたまま、カーソルをDimSalesTerritoryテーブル内のSalesTerritoryId列にドラッグして離します ()。

  2. FactInternetSalesテーブルで、 SalesTerritoryId列をクリックしたまま、カーソルをDimSalesTerritoryテーブルのSalesTerritoryId列にドラッグして離します。

    このリレーションシップの Active プロパティが False (つまり非アクティブ) になっていることを確認します。 これは、FactInternetSales テーブルには、メジャーで使用されている別のアクティブなリレーションシップが既に存在するためです。

クライアント アプリケーションで EmployeeSecurity テーブルを非表示にする

このタスクでは、クライアントアプリケーションのフィールドリストに表示されないように、EmployeeSecurity テーブルを非表示にします。 テーブルを非表示にしても、セキュリティで保護されるわけではないことに注意してください。 方法を知っている場合、ユーザーは引き続き EmployeeSecurity テーブル データのクエリを実行できます。 EmployeeSecurity テーブルのデータをセキュリティで保護するために、ユーザーがそのデータを照会できないようにするには、後の作業でフィルターを適用します。

クライアント アプリケーションで EmployeeSecurity テーブルを非表示にするには

  • モデル デザイナーのダイアグラム ビューで、Employee テーブルの見出しを右クリックし、[クライアント ツールに非表示] をクリックします。

Sales Employees by Territory ユーザー ロールの作成

この作業では、新しいユーザー ロールを作成します。 このロールには、DimSalesTerritory テーブルのどの行がユーザーに表示されるかを定義する行フィルターが含まれます。 このフィルターは、一対多のリレーションシップの方向で、DimSalesTerritory に関連する他のすべてのテーブルに適用されます。 また、ロールのメンバーであるユーザーがクエリを実行できないように、EmployeeSecurity テーブル全体を保護する単純なフィルターも適用します。

注意

このレッスンで作成する Sales Employees by Territory ロールによって、メンバーが参照 (またはクエリを実行) できるデータは、自分が属する販売区域の売上データのみに制限されます。 「レッスン 11: ロールの作成」で作成したロールのメンバーとしても存在する Sales Employees by 区域ロールのメンバーとしてユーザーを追加すると、アクセス許可の組み合わせが得られます。 あるユーザーが複数のロールのメンバーである場合、各ロールに対して定義された権限と行フィルターは累積されます。 つまり、ロールを組み合わせることでユーザーの権限は引き上げられます。

Sales Employees by Territory ユーザー ロールを作成するには

  1. SSDT で、[モデル] メニューをクリックし、[ロール] をクリックします。

  2. [ロール マネージャー] で、 [新規] をクリックします。

    "なし" 権限を設定された新しいロールがリストに追加されます。

  3. 新しいロールをクリックし、 [名前] 列で、ロールの名前を「 Sales Employees by Territory」に変更します。

  4. [権限] 列で、ドロップダウン リストをクリックし、[読み取り] 権限を選択します。

  5. [メンバー] タブをクリックし、 [追加]をクリックします。

  6. [ユーザーまたはグループの選択] ダイアログ ボックスの [選択するオブジェクト名を入力してください] に、EmployeeSecurity テーブルの作成で使用した最初のサンプル ユーザー名を入力します。 [名前の確認] をクリックしてユーザー名が有効であることを確認し、[OK] をクリックします。

    この手順を繰り返して、EmployeeSecurity テーブルの作成で使用した他のサンプル ユーザー名を追加します。

  7. [行フィルター] タブをクリックします。

  8. EmployeeSecurityテーブルの [ DAX フィルター ] 列に、次の式を入力します。

      =FALSE()  
    

    この数式は、すべての列がブール値条件 false に解決されることを指定します。このため、EmployeeSecurity テーブルで Sales Employees by Territory ユーザー ロールのメンバーがクエリを実行できる列はありません。

  9. DimSalesTerritoryテーブルには、次の式を入力します。

    ='Sales Territory'[Sales Territory Id]=LOOKUPVALUE('Employee Security'[Sales Territory Id], 
      'Employee Security'[Login Id], USERNAME(), 
      'Employee Security'[Sales Territory Id], 
      'Sales Territory'[Sales Territory Id]) 
    

    この数式では、LOOKUPVALUE 関数によって、EmployeeSecurity[LoginId] と現在ログオンしている Windows ユーザー名が同じで、EmployeeSecurity[SalesTerritoryId] と DimSalesTerritory[SalesTerritoryId] が同じであるすべての列の DimEmployeeSecurity[SalesTerritoryId] の値が返されます。

    LOOKUPVALUE によって返された一連の 販売区域の ID を使用して、DimSalesTerritory テーブルに表示される行が制限されます。 行の SalesTerritoryID が LOOKUPVALUE 関数で返された一連の ID の中にある行のみが表示されます。

  10. [ロール マネージャー] で、[OK] をクリックします。

Sales Employees by Territory ユーザー ロールのテスト

このタスクでは、SSDT の [分析に含まれる Excel] 機能を使用して、販売員別の営業担当者のユーザーロールの有効性をテストします。 EmployeeSecurity テーブルに追加したユーザー名のいずれかを指定し、ロールのメンバーとして指定します。 このユーザー名は、Excel とモデルの間に作成された接続で有効なユーザー名として使用されます。

Sales Employees by Territory ユーザー ロールをテストするには

  1. SSDT で、[モデル] メニューをクリックし、[Excel で分析] をクリックします。

  2. [Excel で分析] ダイアログ ボックスの [モデルへの接続に使用するユーザー名またはロールを指定します] で、[その他の Windows ユーザー] をクリックし、[参照] をクリックします。

  3. [ユーザーまたはグループの選択] ダイアログ ボックスの [選択するオブジェクト名を入力します] に、EmployeeSecurity テーブルに追加したいずれかのユーザー名を入力し、[名前の確認] をクリックします。

  4. [OK] をクリックして [ユーザーまたはグループの選択] ダイアログ ボックスを閉じ、[OK] をクリックして [Excel で分析] ダイアログ ボックスを閉じます。

    新しいノートブックで Excel が開きます。 ピボットテーブルが自動的に作成されます。 [ピボットテーブルのフィールド] リストには、新しいモデルで使用できるほとんどのデータ フィールドが表示されます。

    EmployeeSecurity テーブルが [ピボットテーブルのフィールド] リストに表示されていないことを確認します。 これは、前の作業でクライアント ツールからこのテーブルを非表示にすることを選択したためです。

  5. [フィールド] リストの ∑ Internet Sales (メジャー) で、InternetTotalSales メジャーを選択します。 メジャーは フィールドに入力されます。

  6. DimSalesTerritory テーブルの SalesTerritoryId 列を選択します。 列は 行ラベル フィールドに入力されます。

    使用した有効なユーザー名が属している 1 つのリージョンのインターネット販売成績のみが表示されていることに注意してください。 たとえば DimGeography テーブルの City など、別の列を "行ラベル" フィールドとして選択すると、有効なユーザーが属する販売区域の都市のみが表示されます。

    このユーザーは、自分が属する区域以外の区域のインターネット販売データを参照したり、クエリを実行することはできません。これは、Sales Employees by Territory ユーザー ロールで Sales Territory テーブルに定義された行フィルターによって、他の販売区域に関連するすべてのデータが効果的に保護されているためです。

参照

USERNAME 関数 (DAX)
LOOKUPVALUE 関数 (DAX)
CUSTOMDATA 関数 (DAX)