Dynamische Sicherheit auf Zeilenebene mit dem tabellarischen Modell von Analysis ServicesDynamic row level security with Analysis services tabular model

In diesem Tutorial verwenden Sie ein Beispieldataset, um die unten aufgeführten Schritte durchzuführen. Dabei erhalten Sie Informationen zur Sicherheit auf Zeilenebene in einem Analysis Services-Tabellenmodell und verwenden dieses in einem Power BI-Bericht.Using a sample dataset to work through the steps below, this tutorial shows you how to implement row level security in an Analysis Services Tabular Model and use it in a Power BI report.

  • Erstellen einer neuen Sicherheitstabelle in der AdventureworksDW2012-DatenbankCreate a new security table in the AdventureworksDW2012 database
  • Erstellen des tabellarischen Modells mit erforderlichen Fakten- und DimensionstabellenBuild the tabular model with necessary fact and dimension tables
  • Definieren von Benutzerrollen und -berechtigungenDefine user roles and permissions
  • Bereitstellen des Modells auf einer Analysis Services-TabelleninstanzDeploy the model to an Analysis Services tabular instance
  • Erstellen eines Power BI Desktop-Berichts, der Daten anzeigt, die genau auf den Benutzer zugeschnitten sind, der auf den Bericht zugreiftBuild a Power BI Desktop report that displays data tailored to the user accessing the report
  • Bereitstellen des Berichts im Power BI-DienstDeploy the report to Power BI service
  • Erstellen eines neuen Dashboards basierend auf dem BerichtCreate a new dashboard based on the report
  • Freigeben des Dashboards an Ihre KollegenShare the dashboard with your coworkers

Für dieses Tutorial ist die AdventureworksDW2012-Datenbank erforderlich.This tutorial requires the AdventureworksDW2012 database.

Aufgabe 1: Erstellen einer Benutzersicherheitstabelle und Definieren der DatenbeziehungTask 1: Create the user security table and define data relationship

Es gibt viele Artikel, in denen das Definieren der dynamischen Sicherheit auf Zeilenebene mit dem SQL Server Analysis Services-Tabellenmodell beschrieben wird.You can find many articles describing how to define row level dynamic security with the SQL Server Analysis Services (SSAS) tabular model. In unserem Beispiel folgen wir dem Artikel Implement Dynamic Security by Using Row Filters (Implementieren dynamischer Sicherheit mithilfe von Zeilenfiltern).For our sample, we use Implement Dynamic Security by Using Row Filters.

Für die hier aufgeführten Schritte ist die relationale Datenbank AdventureworksDW2012 erforderlich.The steps here require using the AdventureworksDW2012 relational database.

  1. Erstellen Sie in AdventureworksDW2012 wie unten gezeigt die Tabelle DimUserSecurity.In AdventureworksDW2012, create the DimUserSecurity table as shown below. Sie können SQL Server Management Studio (SSMS) zum Erstellen der Tabelle verwenden.You can use SQL Server Management Studio (SSMS) to create the table.

  2. Nachdem Sie die Tabelle erstellt und gespeichert haben, müssen Sie die Beziehung zwischen der SalesTerritoryID-Spalte der DimUserSecurity-Tabelle und der SalesTerritoryKey-Spalte der DimSalesTerritory-Tabelle erstellen. Dies wird in der folgenden Abbildung gezeigt.Once you create and save the table, you need to establish the relationship between the DimUserSecurity table's SalesTerritoryID column and the DimSalesTerritory table's SalesTerritoryKey column, as shown below.

    Klicken Sie in SSMS mit der rechten Maustaste auf die Tabelle DimUserSecurity, und klicken Sie auf Design (Entwurf).In SSMS, right-click on the DimUserSecurity table, and select Design. Klicken Sie dann auf Table Designer > Relationships... (Tabellen-Designer > Beziehungen...). Speichern Sie anschließend die Tabelle.Then select Table Designer -> Relationships.... When done, save the table.

  3. Fügen Sie der Tabelle Benutzer hinzu. Klicken Sie dazu mit der rechten Maustaste auf die Tabelle DimUserSecurity, und wählen Sie Edit Top 200 Rows (Oberste 200 Zeilen bearbeiten) aus.Add users to the table: right-click on the DimUserSecurity table and select Edit Top 200 Rows. Wenn Sie Benutzer hinzugefügt haben, sollte die Tabelle DimUserSecurity in etwa wie folgt aussehen, nur mit eigenen Benutzern:Once you’ve added users, the DimUserSecurity table should appear similar to the following, though with your own users:

    Sie werden in den nächsten Aufgaben zu diesen Benutzern zurückkehren.You'll see these users in upcoming tasks.

  4. Als Nächstes führen wir einen inneren Join mit der DimSalesTerritory-Tabelle durch, die Details zur Region anzeigt, die dem Benutzer zugeordnet ist.Next, do an inner join with the DimSalesTerritory table, which shows the user associated region details. Der folgende SQL-Code führt den inneren Join durch, und das folgende Bild zeigt, wie die Tabelle danach aussieht.The SQL code here does the inner join, and the image shows how the table then appears.

    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]
    

    Auf dem Bild wird gezeigt, wer für jede Vertriebsregion zuständig ist. Dies ist aufgrund der in Schritt 2 erstellten Beziehung möglich.The image shows who is responsible for each sales region, thanks to the relationship created in Step 2. Sie sehen z. B., dass Jon Dow für Australien zuständig ist.For example, you can see that Jon Doe is responsible for Australia.

Aufgabe 2: Erstellen des tabellarischen Modells mit Fakten- und DimensionstabellenTask 2: Create the tabular model with facts and dimension tables

  1. Sobald Ihr relationales Data Warehouse vorhanden ist, müssen Sie das Tabellenmodell definieren.Once your relational data warehouse is in place, you need to define the tabular model. Das Modell kann mit SQL Server Data Tools (SSDT) erstellt werden.You can create the model using SQL Server Data Tools (SSDT). Weitere Informationen finden Sie unter Create a New Tabular Model Project (Erstellen eines neuen Tabellenmodells).For more information, see Create a New Tabular Model Project.

  2. Importieren Sie alle erforderlichen Tabellen so wie unten dargestellt in das Modell.Import all the necessary tables into the model as shown below.

  3. Nachdem Sie die erforderlichen Tabellen importiert haben, müssen Sie eine Rolle namens SalesTerritoryUsers mit Leseberechtigung definieren.Once you’ve imported the necessary tables, you need to define a role called SalesTerritoryUsers with Read permission. Klicken Sie in SSDT auf das Menü Model (Modell) und anschließend auf Roles (Rollen).Select the Model menu in SQL Server Data Tools, and then select Roles. Klicken Sie im Dialogfeld Role Manager (Rollen-Manager) auf New (Neu).In the Role Manager dialog box, select New.

  4. Fügen Sie auf der Registerkarte Members (Mitglieder) im Rollen-Manager die Benutzer hinzu, die Sie in der DimUserSecurity-Tabelle in Aufgabe 1 – Schritt 3 definiert haben.Under Members tab in the Role Manager, add the users that you defined in the DimUserSecurity table in Task 1 - step 3.

  5. Fügen Sie anschließend die korrekten Funktionen für die Tabellen DimSalesTerritory und DimUserSecurity hinzu, wie unten unter der Registerkarte Zeilenfilter gezeigt.Next, add the proper functions for both DimSalesTerritory and DimUserSecurity tables, as shown below under Row Filters tab.

  6. In diesem Schritt verwenden wir die LOOKUPVALUE-Funktion zum Zurückgeben von Werten für eine Spalte, in der der Windows-Benutzername dem von der Funktion USERNAME zurückgegebenen Benutzernamen entspricht.In this step, you use the LOOKUPVALUE function to return values for a column in which the Windows user name matches the one the USERNAME function returns. Dann können Sie die Abfrage einschränken, sodass die von LOOKUPVALUE zurückgegebenen Werte den Werten in derselben oder einer verwandten Tabelle entsprechen.You can then restrict queries to where the LOOKUPVALUE returned values match ones in the same or related table. Geben Sie in der Spalte DAX Filter die folgende Formel ein:In the DAX Filter column, type the following formula:

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

    In dieser Formel gibt die LOOKUPVALUE-Funktion alle Werte für die Spalte DimUserSecurity[SalesTerritoryID] zurück, wobei DimUserSecurity[UserName] dem Namen des gegenwärtig eingeloggten Windowsbenutzers und DimUserSecurity[SalesTerritoryID] DimSalesTerritory[SalesTerritoryKey] entspricht.In this formula, the LOOKUPVALUE function returns all values for the DimUserSecurity[SalesTerritoryID] column, where the DimUserSecurity[UserName] is the same as the current logged on Windows user name, and DimUserSecurity[SalesTerritoryID] is the same as the DimSalesTerritory[SalesTerritoryKey].

    Wichtig

    Beachten Sie, dass die DAX-Funktion USERELATIONSHIP nicht unterstützt wird, wenn Sie Sicherheit auf Zeilenebene verwenden.When using row level security, the DAX function USERELATIONSHIP is not supported.

    Die Rückgabe von LOOKUPVALUE von SalesTerritoryKey wird verwendet, um die Zeilen, die in DimSalesTerritory angezeigt werden, zu beschränken.The set of Sales SalesTerritoryKey's LOOKUPVALUE returns is then used to restrict the rows shown in the DimSalesTerritory. Es werden nur Zeilen angezeigt, in denen sich der SalesTerritoryKey-Wert in den IDs befindet, die von der LOOKUPVALUE-Funktion zurückgegeben werden.Only rows where the SalesTerritoryKey value is in the IDs that the LOOKUPVALUE function returns are displayed.

  7. Fügen Sie für die Tabelle DimUserSecurity in der DAX Filter-Spalte die folgende Formel ein:For the DimUserSecurity table, in the DAX Filter column, add the following formula:

    =FALSE()
    

    Diese Formel gibt an, dass alle Spalten in false aufgelöst werden soll. Das bedeutet, dass Spalten in der Tabelle DimUserSecurity nicht abgefragt werden können.This formula specifies that all columns resolve to false; meaning DimUserSecurity table columns can't be queried.

  8. Nun müssen Sie das Modell verarbeiten und bereitstellen.Now you need to process and deploy the model. Weitere Informationen finden Sie im Artikel zum Bereitstellen.For more information, see the Deploy article.

Aufgabe 3: Hinzufügen von Datenquellen im lokalen DatengatewayTask 3: Add Data Sources within your On-premises data gateway

Sobald das tabellarische Modell bereitgestellt und für die Verwendung bereit ist, müssen Sie eine Datenquellenverbindung mit Ihrem lokalen tabellarischen Analysis Services-Server hinzufügen.Once your tabular model is deployed and ready for consumption, you need to add a data source connection to your on-premises Analysis Services tabular server.

  1. Sie müssen ein lokales Datengateway in Ihrer Umgebung installiert und konfiguriert haben, damit der Power BI-Dienst auf Ihren lokalen Analysedienst zugreifen kann.To allow the Power BI service access to your on-premises analysis service, you need an On-premises data gateway installed and configured in your environment.

  2. Wenn das Gateway ordnungsgemäß konfiguriert wurde, müssen Sie eine Datenquellenverbindung für die Analysis Services-Tabelleninstanz erstellen.Once the gateway is correctly configured, you need to create a data source connection for your Analysis Services tabular instance. Weitere Informationen finden Sie unter Verwalten Ihrer Datenquelle – Analysis Services.For more information, see Manage your data source - Analysis Services.

Wenn der vorherige Schritt abgeschlossen wurde, ist das Gateway konfiguriert und kann mit der lokalen Analysis Services-Datenquelle interagieren.With the previous step complete, the gateway is configured and ready to interact with your on-premises Analysis Services data source.

Aufgabe 4: Erstellen eines Berichts basierend auf einem Analysis Services-Tabellenmodell mit Power BI DesktopTask 4: Create report based on analysis services tabular model using Power BI desktop

  1. Starten Sie Power BI Desktop , und wählen Sie Daten abrufen > Database aus.Launch Power BI Desktop and select Get Data > Database.

  2. Wählen Sie aus der Liste der Datenquellen die SQL Server Analysis Services-Datenbank, und klicken Sie auf Verbinden.From the data sources list, select the SQL Server Analysis Services Database and select Connect.

  3. Geben Sie Ihre Details zur Analysis Services-Tabelleninstanz ein, und wählen Sie Live verbinden aus.Fill in your Analysis Services tabular instance details and select Connect Live. Wählen Sie dann OK aus.Then select OK. Mit Power BI funktioniert die dynamische Sicherheit nur mit einer Liveverbindung.With Power BI, dynamic security works only with Live connection.

  4. Sie sehen, dass sich das bereitgestellte Modell in der Analysis Services-Instanz befindet.You can see that the deployed model is in the Analysis Services instance. Wählen Sie das jeweilige Modell, und klicken Sie auf OK.Select the respective model and then select OK.

    Power BI Desktop zeigt nun alle verfügbaren Felder rechts neben dem Zeichenbereich im Bereich Felder an.Power BI Desktop now displays all the available fields, to the right of the canvas in the Fields pane.

  5. Wählen Sie rechts im Bereich Felder das SalesAmount-Measure aus der FactInternetSales-Tabelle und die SalesTerritoryRegion-Dimension aus der SalesTerritory-Tabelle aus.In the Fields pane on the right, select the SalesAmount measure from the FactInternetSales table and the SalesTerritoryRegion dimension from the SalesTerritory table.

  6. Wir wollen diesen Bericht einfach halten, also fügen wir im Moment keine weiteren Spalten hinzu.To keep this report simple, we won’t add any more columns right now. Ändern Sie die Visualisierung in ein Ringdiagramm, um die Datendarstellung aussagekräftiger zu gestalten.To have a more meaningful data representation, change the visualization to Donut chart.

  7. Wenn Ihr Bericht fertig ist, können Sie ihn direkt im Power BI-Portal veröffentlichen.Once your report is ready, you can directly publish it to the Power BI portal. Wählen Sie auf dem Menüband Start in Power BI Desktop Veröffentlichen aus.From the Home ribbon in Power BI Desktop, select Publish.

Aufgabe 5: Erstellen und Freigeben eines DashboardsTask 5: Create and share a dashboard

  1. Sie haben bis jetzt einen Bericht erstellt und ihn im Power BI-Dienst veröffentlicht.You’ve created the report and published it to the Power BI service. Jetzt können Sie das vorherig erstellte Beispiel verwenden, um ein Szenario zum Sichern von Modellen zu veranschaulichen.Now you can use the example created in previous steps to demonstrate the model security scenario.

    In seiner Rolle als Vertriebsleiter kann Sumit Daten von allen verschiedenen Vertriebsregionen anzeigen.In the role as Sales Manager, Sumit can see data from all the different sales regions. Er erstellt also diesen Bericht (der Bericht, der in den vorherigen Schritten erstellt wurde) und veröffentlicht ihn im Power BI-Dienst.Sumit creates this report (the report created in the previous task steps) and publishes it to the Power BI service.

    Nachdem Sumit den Bericht veröffentlicht hat, besteht sein nächster Schritt darin, basierend auf diesem Bericht im Power BI-Dienst ein Dashboard namens TabularDynamicSec zu erstellen.Once Sumit publishes the report, their next step will be to create a dashboard in the Power BI service called TabularDynamicSec based on that report. Beachten Sie in der folgenden Abbildung, dass Sumit die Daten aus allen Vertriebsregionen anzeigen kann.In the following image, notice that Sumit can see the data corresponding to all the sales region.

  2. Sumit gibt das Dashboard für seinen Kollegen Jon Doe frei, der für den Vertrieb in der Region Australien zuständig ist.Now Sumit shares the dashboard with a colleague, Jon Doe, who is responsible for the Australia region sales.

  3. Wenn Jon Doe sich im Power BI-Dienst anmeldet und das freigegebene Dashboard anzeigt, das Sumit erstellt hat, sollten nur Umsätze aus seiner Region zu sehen sein.When Jon Doe logs in to the Power BI service and views the shared dashboard that Sumit created, only sales from their region should be visible.

    Herzlichen Glückwunsch!Congratulations! Der Power BI-Dienst zeigt die dynamische Sicherheit auf Zeilenebene an, die im lokalen Analysis Services-Tabellenmodell definiert wurde.The Power BI service shows the dynamic row level security defined in the on-premises Analysis Services tabular model. Power BI verwendet die Eigenschaft EffectiveUserName, um die aktuellen Power BI-Benutzeranmeldeinformationen zum Ausführen der Abfragen an die lokale Datenquelle zu senden.Power BI uses the EffectiveUserName property to send the current Power BI user credential to the on-premises data source to run the queries.

Aufgabe 6: Verstehen der HintergrundvorgängeTask 6: Understand what happens behind the scenes

Bei dieser Aufgabe wird davon ausgegangen, dass Sie sich mit dem SQL Server Profiler auskennen, da Sie eine SQL Server Profiler-Ablaufverfolgung auf Ihrer lokalen SSAS-Tabelleninstanz erfassen müssen.This task assumes you're familiar with SQL Profiler, since you need to capture a SQL Server profiler trace on your on-premises SSAS tabular instance.

  1. Sobald der Benutzer (Jon Doe) auf das Dashboard im Power BI-Dienst zugreift, wird die Sitzung initialisiert.The session gets initialized as soon as the user (Jon Doe) accesses the dashboard in the Power BI service. Wie Sie sehen, nimmt die SalesTerritoryUsers-Rolle unmittelbar den effektiven Benutzernamen jondoe@moonneo.com an.You can see that the salesterritoryusers role takes an immediate effect with the effective user name as jondoe@moonneo.com

    <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>jondoe@moonneo.com</EffectiveUserName></PropertyList>
    
  2. Basierend auf den effektiven Anforderungen des Benutzernamens konvertiert Analysis Services die Anforderung in den tatsächlichen Benutzernamen moonneo\jondoe, nachdem die lokale Active Directory Domain Services-Instanz abgefragt wurde.Based on the effective user name request, Analysis Services converts the request to the actual moonneo/jondoe credential after querying the local Active Directory. Sobald Analysis Services die Anmeldeinformationen abgefragt hat, gibt Analysis Services die Daten zurück, die der Benutzer anzeigen und auf die er zugreifen darf.Once Analysis Services gets the credential, Analysis Services returns the data the user has permission to view and access.

  3. Wenn im Dashboard weitere Aktivitäten auftreten, z.B. falls Jon Doe vom Dashboard auf den zugrundeliegenden Report zugreift, können Sie mit SQL Profiler eine spezifische Abfrage anzeigen, die als DAX-Abfrage wieder zum Analysis Services-Tabellenmodell zurückkehrt.If more activity occurs with the dashboard, for example, if Jon Doe goes from the dashboard to the underlying report, with SQL Profiler you would see a specific query coming back to the Analysis Services tabular model as a DAX query.

  4. Sie können unten auch die DAX-Abfrage sehen, die ausgeführt wird, um die Berichtsdaten aufzufüllen.You can also see below the DAX query that is getting executed to populate report data.

    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>jondoe@moonneo.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>
    

ÜberlegungenConsiderations

  • Die lokale Sicherheit auf Zeilenebene mit Power BI ist nur mit einer Liveverbindung verfügbar.On-premises row level security with Power BI is only available with Live Connection.

  • Alle Änderungen an Daten, die nach der Modellverarbeitung vorgenommen werden, stehen in Power BI unmittelbar allen Benutzern zur Verfügung, die über eine Liveverbindung auf den Bericht zugreifen.Any changes in the data after processing the model would be immediately available for the users accessing the report with Live Connection from the Power BI service.