자습서: Analysis Services 테이블 형식 모델을 사용하여 동적 행 수준 보안Tutorial: Dynamic row level security with Analysis services tabular model

이 자습서는 Analysis Services 테이블 형식 모델 내에서 행 수준 보안을 구현하는 데 필요한 단계를 설명하고 Power BI 보고서에서 사용하는 방법을 보여 줍니다.This tutorial demonstrates the steps necessary to implement row level security within your Analysis Services Tabular Model, and shows how to use it in in a Power BI report. 이 자습서의 단계는 샘플 데이터 집합에서 완료하여 필요한 단계를 따르고 알아볼 수 있도록 설계되었습니다.The steps in this tutorial are designed to let you follow along and learn the steps necessary by completing on a sample dataset.

이 자습서에서 다음 단계는 Analysis Services 테이블 형식 모델로 동적 행 수준 보안을 구현하기 위해 수행해야 하는 작업을 이해할 수 있도록 자세히 설명되어 있습니다.During this tutorial, the following steps are described in detail, helping you understand what you need to do to implement dynamic row level security with Analysis Services tabular model:

  • AdventureworksDW2012 데이터베이스에서 새 보안 테이블 만들기Create a new security table in the AdventureworksDW2012 database
  • 필요한 팩트 및 차원 테이블을 사용하여 테이블 형식 모델 빌드Build the tabular model with necessary fact and dimension tables
  • 사용자에 대한 역할 및 권한 정의Define the roles and permissions for the users
  • Analysis Services 테이블 형식 인스턴스에 모델 배포Deploy the model to an Analysis Services tabular instance
  • Power BI Desktop을 사용하여 보고서에 액세스하는 사용자에게 해당하는 데이터를 표시하는 보고서 작성Use Power BI Desktop to build a report that displays the data corresponding to the user accessing the report
  • Power BI 서비스에 보고서 배포Deploy the report to Power BI service
  • 보고서를 기반으로 새 대시보드 만들기 및 마지막으로Create a new dashboard based on the report, and finally,
  • 동료와 대시보드 공유Share the dashboard with your coworkers

이 자습서의 단계를 수행하려면 여기에서 다운로드할 수 있는 AdventureworksDW2012 데이터베이스가 필요합니다.To follow the steps in this tutorial you need the AdventureworksDW2012 database, which you can download here.

작업 1: 사용자 보안 테이블 만들기 및 데이터 관계 정의Task 1: Create the user security table and define data relationship

SSAS(SQL Server Analysis Services) 테이블 형식 모델을 사용하여 행 수준 동적 보안을 정의하는 방법을 설명하는 게시된 문서가 많이 있습니다.There are many published articles describing how to define row level dynamic security with SQL Server Analysis Services (SSAS) tabular model. 샘플의 경우 이 문서를 따릅니다.For our sample we follow this article. 다음 단계는 이 자습서에서 첫 번째 작업을 안내합니다.The following steps walk you through the first task in this tutorial.

  1. 샘플의 경우 AdventureworksDW2012 관계형 데이터베이스를 사용하고 있습니다.For our sample, we're using AdventureworksDW2012 relational database. 해당 데이터베이스에서 다음 그림에 나와 있는 것처럼 DimUserSecurity 테이블을 만듭니다.In that database, create the DimUserSecurity table, as shown in the following image. 이 샘플의 경우 테이블을 만들기 위해 SSMS(SQL Server Management Studio)를 사용하고 있습니다.For this sample, we're using SQL Server Management Studio (SSMS) to create the table.

  2. 테이블이 만들어지고 저장되면 다음 그림에 나와 있는 것처럼 DimUserSecurity 테이블의 SalesTerritoryID 열과 DimSalesTerritory 테이블의 SalesTerritoryKey 열 사이에 관계를 만들어야 합니다.Once the table is created and saved, we need to create the relationship between the DimUserSecurity table's SalesTerritoryID column and DimSalesTerritory table's SalesTerritoryKey column, as shown in the following image. DimUserSecurity 테이블을 마우스 오른쪽 단추로 클릭하고 편집을 선택하여 SSMS에서 이 작업을 수행할 수 있습니다.This can be done from SSMS by right-clicking on the DimUserSecurity table, and selecting Edit.

  3. 테이블을 저장한 다음 다시 DimUserSecurity 테이블을 마우스 오른쪽 단추로 클릭한 다음 상위 200개 행 편집을 선택하여 몇 개의 사용자 정보 행을 테이블에 추가합니다.Save the table, then add few rows of user information in to the table by again right clicking on the DimUserSecurity table and then selecting Edit top 200 rows. 해당 사용자를 추가한 후 DimUserSecurity 테이블의 행은 다음 그림에서 수행하는 것처럼 보입니다.Once you’ve added those users, the rows of the DimUserSecurity table look like they do in the following image:

    이후 작업에서 해당 사용자로 다시 돌아오겠습니다.We’ll come back to these users in upcoming tasks.

  4. 다음으로 사용자와 연결된 지역 세부 정보를 보여 주는 DimSalesTerritory 테이블을 사용하여 내부 조인을 수행합니다.Next we do an inner join with the DimSalesTerritory table, which shows the region details associated with the user. 다음 코드는 내부 조인을 수행하고 다음에 나오는 이미지는 내부 조인이 성공하면 테이블이 나타나는 방법을 보여 줍니다.The following code performs the inner join, and the image that follows shows how the table appears once the inner join is successful.

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

  5. 위의 이미지는 사용자가 담당하는 판매 지역과 같은 정보를 보여 줍니다.Notice that the above image shows information such as which user is responsible for which sales region. 2단계에서 만든 관계 때문에 해당 데이터가 표시됩니다.That data is displayed because of the relationship that we created in Step 2. 또한 사용자 Jon Doe는 오스트레일리아 판매 지역의 일부입니다.Also, note that the user Jon Doe is part of the Australia sales region. 이후 단계 및 작업에서 John Doe를 다시 방문할 예정입니다.We’ll revisit John Doe in upcoming steps and tasks.

작업 2: 팩트 및 차원 테이블을 사용하여 테이블 형식 모델 만들기Task 2: Create the tabular model with facts and dimension tables

  1. 관계형 데이터 웨어하우스가 준비되면 이제 테이블 형식 모델을 정의할 시간입니다.Once your relational data warehouse is in place, it’s time to define your tabular model. SSDT(SQL Server 데이터 도구)를 사용하여 모델을 만들 수 있습니다.The model can be created using SQL Server Data Tools (SSDT). 테이블 형식 모델을 정의하는 방법에 대한 자세한 정보를 가져오려면 이 문서를 참조하세요.To get more information about how to define a tabular model, please refer this article.
  2. 아래와 같이 필요한 모든 테이블을 모델로 가져옵니다.Import all the necessary tables in to the model as shown below.

  3. 필요한 테이블을 가져오면 읽기 권한으로 SalesTerritoryUsers라는 역할을 정의해야 합니다.Once you’ve imported the necessary tables, you need to define a role called SalesTerritoryUsers with Read permission. SQL Server 데이터 도구의 모델 메뉴를 클릭한 다음 역할을 클릭하여 수행할 수 있습니다.This can be achieved by clicking on the Model menu in SQL Server Data Tools, and then clicking Roles. 역할 관리자 대화 상자에서 새로 만들기를 클릭합니다.In the Role Manager dialog box, click New.
  4. 역할 관리자멤버 탭 아래에서 작업 1 - 3단계DimUserSecurity 테이블에서 정의한 사용자를 추가합니다.Under Members tab in the Role Manager, add the users that we defined in the DimUserSecurity table in Task 1 - step 3.

  5. 다음으로 행 필터 탭 아래에서 아래에 표시된 대로 DimSalesTerritoryDimUserSecurity 테이블에 대한 적절한 함수를 추가합니다.Next, add the proper functions for both DimSalesTerritory and DimUserSecurity tables, as shown below under Row Filters tab.

  6. 이 단계에서 LOOKUPVALUE 함수를 사용하여 Windows 사용자 이름이 USERNAME 함수로 반환된 사용자 이름과 동일한 열에 대한 값을 반환합니다.In this step, we use the LOOKUPVALUE function to return values for a column in which the Windows user name is the same as the user name returned by the USERNAME function. 쿼리는 LOOKUPVALUE로 반환된 값이 동일한 또는 관련 테이블의 값과 일치하는 것으로 제한될 수 있습니다.Queries can then be restricted where the values returned by LOOKUPVALUE match values in the same or related table. DAX 필터 열에서 다음 수식을 입력합니다.In the DAX Filter column, type the following formula:

    =DimSalesTerritory[SalesTerritoryKey]=LOOKUPVALUE(DimUserSecurity[SalesTerritoryID], DimUserSecurity[UserName], USERNAME(), DimUserSecurity[SalesTerritoryID], DimSalesTerritory[SalesTerritoryKey])
    
  7. 이 수식에서 LOOKUPVALUE 함수는 DimUserSecurity [SalesTerritoryID] 열에 대한 모든 값을 반환합니다. 여기에서 DimUserSecurity [UserName]은 현재 로그온된 Windows 사용자 이름과 같고 DimUserSecurity [SalesTerritoryID]DimSalesTerritory [SalesTerritoryKey]와 같습니다.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].

    LOOKUPVALUE에서 반환된 Sales SalesTerritoryKey의 집합은 DimSalesTerritory에 표시된 행을 제한하는 데 사용됩니다.The set of Sales SalesTerritoryKey's returned by LOOKUPVALUE is then used to restrict the rows shown in the DimSalesTerritory. 행에 대한 SalesTerritoryKeyLOOKUPVALUE 함수에서 반환된 ID의 집합에 있는 행만 표시됩니다.Only rows where the SalesTerritoryKey for the row is in the set of IDs returned by the LOOKUPVALUE function are displayed.

  8. DimUserSecurity 테이블의 경우 DAX 필터 열에서 다음 수식을 입력합니다.For the DimUserSecurity table, in the DAX Filter column, type the following formula.

    =FALSE()
    
  9. 이 수식은 모든 열이 false 부울 조건에 대해 확인하는 것을 지정하므로 DimUserSecurity 테이블에 대한 열을 쿼리할 수 없습니다.This formula specifies that all columns resolve to the false Boolean condition; therefore, no columns for the DimUserSecurity table can be queried.
  10. 이제 모델을 처리하고 배포해야 합니다.Now we need to process and deploy the model. 모델 배포에 대한 도움말은 이 문서에서 참조할 수 있습니다.You can refer this article for assistance in deploying the model.

작업 3: 온-프레미스 데이터 게이트웨이 내에서 데이터 원본 추가Task 3: Adding Data Sources within your on-premises data gateway

  1. 테이블 형식 모델이 배포되고 사용 준비가 되면 Power BI 포털에서 온-프레미스 Analysis Services 테이블 형식 서버에 데이터 원본 연결을 추가해야 합니다.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 with in your Power BI portal.
  2. 온-프레미스 분석 서비스에 대한 Power BI 서비스 액세스를 허용하려면 사용자 환경에 온-프레미스 데이터 게이트웨이를 설치하고 구성해야 합니다.To allow the Power BI service access your on-premises analysis service, you need to have an on-premises data gateway installed and configured in your environment.
  3. 게이트웨이가 올바르게 구성되었으면 Analysis Services 테이블 형식 인스턴스에 대한 데이터 원본 연결을 만들어야 합니다.Once the gateway is correctly configured, you need to create a data source connection for your Analysis Services tabular instance. 이 문서는 Power BI 포털 내에서 데이터 원본을 추가하는 데 도움이 됩니다.This article will help you with adding data source within the Power BI portal.

  4. 이전 단계를 완료하여 게이트웨이가 구성되고 온-프레미스 Analysis Services 데이터 원본과 상호 작용할 준비가 되었습니다.With the previous step complete, the gateway is configured and ready interact with your on-premises Analysis Services data source.

작업 4: Power BI Desktop을 사용하여Aanlysis Services 테이블 형식 모델 기반 보고서 만들기Task 4: Creating report based on analysis services tabular model using Power BI desktop

  1. Power BI Desktop을 시작하고 데이터 가져오기 > 데이터베이스를 선택합니다.Launch Power BI Desktop and select Get Data > Database.
  2. 데이터 원본 목록에서 SQL Server Analysis Services 데이터베이스를 선택하고 연결을 선택합니다.From the list of data sources, select the SQL Server Analysis Services Database and select connect.

  3. Analysis Services 테이블 형식 인스턴스 세부 정보를 입력하고 라이브 연결을 선택합니다.Fill in your Analysis Services tabular instance details and select Connect Live. 확인을 선택합니다.Select OK. Power BI와 함께 동적 보안은 라이브 연결만을 사용하여 작동합니다.With Power BI, dynamic security works only with Live connection.

  4. Analysis Services 인스턴스에 배포된 모델이 표시됩니다.You'll see that the model that was deployed in the Analysis Services instance. 해당 모델을 선택하고 확인을 선택합니다.Select the respective model and select OK.

  5. Power BI Desktop은 이제 필드 창의 캔버스 오른쪽에 사용 가능한 모든 필드를 표시합니다.Power BI Desktop now displays all the available fields, to the right of the canvas in the Fields pane.
  6. 오른쪽의 필드 창에서 FactInternetSales 테이블의 SalesAmount 측정 및 SalesTerritory 테이블의 SalesTerritoryRegion 차원을 선택합니다.In the Fields pane on the right, select the SalesAmount measure from FactInternetSales table and SalesTerritoryRegion dimension from SalesTerritory table.
  7. 이 보고서를 간단하게 유지하므로 지금 더 많은 열을 추가하지 않습니다.We’ll keep this report simple, so right now we won’t add any more columns. 좀 더 의미 있는 데이터 표현을 위해 시각화를 도넛형 차트로 변경합니다.To have more meaningful representation of the data, we'll change the visualization to Donut chart.

  8. 보고서가 준비되면 Power BI 포털에 직접 게시할 수 있습니다.Once your report is ready, you can directly publish it to the Power BI portal. Power BI Desktop 리본에서 게시를 선택합니다.From the Home ribbon in Power BI Desktop, select Publish.

작업 5: 대시보드 만들기 및 공유Task 5: Creating and sharing a dashboard

  1. 보고서를 만들고 Power BI Desktop에서 게시를 클릭했으므로 보고서는 Power BI 서비스에 게시됩니다.You’ve created the report and clicked Publish in Power BI Desktop, so the report is published to the Power BI service. 이제 서비스 중이므로 이전 단계에서 만든 예제를 사용하여 모델 보안 시나리오를 설명할 수 있습니다.Now that it’s in the service, our model security scenario can be demonstrated by using the example we created in the previous steps.

    그의 역할에서 판매 관리자 - Sumit은 다른 모든 판매 지역의 데이터를 볼 수 있습니다.In his role, Sales Manager - Sumit can see data from all the different sales regions. 따라서 그는 이 보고서(이전 작업 단계에서 만든 보고서)를 만들고 Power BI 서비스에 게시합니다.So he creates this report (the report created in the previous task steps) and publishes it to the Power BI service.

    보고서를 게시하면 해당 보고서를 기반으로 Power BI 서비스에 TabularDynamicSec이라는 대시보드를 만듭니다.Once he publishes the report, he creates a dashboard in the Power BI service called TabularDynamicSec based on that report. 다음 그림에서 판매 관리자(Sumit)는 모든 판매 지역에 해당하는 데이터를 볼 수 있습니다.In the following image, notice that the sales Manager (Sumit) is able to see the data corresponding to all the sales region.

  2. 이제 Sumit은 오스트레일리아 지역의 판매 담당인 그의 동료 Jon Doe와 대시보드를 공유합니다.Now Sumit shares the dashboard with his colleague, Jon Doe, who is responsible for sales in Australia region.

  3. Jon Doe가 Power BI 서비스에 로그인하고 Sumit이 만든 공유 대시보드를 볼 때 Jon Doe는 그가 담당하는 지역의 판매 봐야 합니다.When Jon Doe logs in to the Power BI service and views the shared dashboard that Sumit created, Jon Doe should see only the sales from his region for which he is responsible. 따라서 Jon Doe가 로그인하고 Sumit이 함께 공유하는 대시보드에 액세스하고 Jon Doe는 오스트레일리아 지역의 판매 봅니다.So Jon Doe logs in, accesses the dashboard that Sumit shared with him, and Jon Doe sees only the sales from the Australia region.

  4. 축하합니다!Congratulations! 온-프레미스 Analysis Services 테이블 형식 모델에서 정의된 동적 행 수준 보안이 Power BI 서비스에 성공적으로 반영되고 관찰되었습니다.The dynamic row level security that was defined in the on-premises Analysis Services tabular model has been successfully reflected and observed in the Power BI service. Power BI는 effectiveusername 속성을 사용하여 쿼리를 실행하도록 현재 Power BI 사용자 자격 증명을 온-프레미스 데이터 원본에 전송합니다.Power BI uses the effectiveusername property to send the current Power BI user credential to the on-premises data source to run the queries.

작업 6: 내부적으로 수행되는 작업 이해Task 6: Understanding what happens behind the scenes

  1. 이 작업은 온-프레미스 SSAS 테이블 형식 인스턴스에서 SQL Server 프로파일러 추적을 캡처해야 하므로 SQL 프로파일러와 익숙하다고 가정합니다.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.
  2. 세션은 사용자(이 경우 Jon Doe)가 Power BI 서비스의 대시보드에 액세스하는 즉시 초기화됩니다.The session gets initialized as soon as the user (Jon Doe, in this case) accesses the dashboard in the Power BI service. salesterritoryusers 역할이 jondoe@moonneo.com의 유효 사용자 이름으로 즉시 적용되는 것을 볼 수 있습니다.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>
    
  3. 유효 사용자 이름 요청에 따라 Analysis Services는 로컬 Active Directory를 쿼리 한 후 요청을 실제 moonneo\jondoe 자격 증명으로 변환합니다.Based on the effective user name request, Analysis Services converts the request to the actual moonneo\jondoe credential after querying the local Active Directory. Analysis Services가 Active Directory에서 실제 자격 증명을 가져오면 액세스에 따라 사용자는 데이터에 대한 권한을 가지고 Analysis Services는 권한이 있는 데이터만을 반환합니다.Once Analysis Services gets the actual credential from Active Directory, then based on the access the user has permissions for on the data, Analysis Services returns the only the data for which he or she has permission.
  4. 대시보드에서 더 많은 작업이 발생하는 경우, 예를 들어 Jon Doe가 SQL 프로파일러를 사용하여 대시보드에서 기본 보고서로 이동하면 특정 쿼리가 DAX 쿼리로 Analysis Services 테이블 형식 모델로 돌아오는 것을 볼 수 있습니다.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.

  5. 또한 아래에서 DAX 쿼리가 실행되어 보고서에 대한 데이터를 채우는 것을 볼 수 있습니다.You can also see below the DAX query that is getting executed to populate the data for the report.

    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>
    

고려 사항Considerations

행 수준 보안, SSAS 및 Power BI를 사용하여 작업할 때 염두에 두어야 할 몇 가지 고려 사항이 있습니다.There are a few considerations to keep in mind when working with row level security, SSAS and Power BI.

  1. Power BI와 온-프레미스 행 수준 보안은 라이브 연결로만 제공됩니다.On-premises row level security with Power BI is only available with Live Connection.
  2. 모델 처리 후 데이터의 변경 내용은 Power BI 서비스의 라이브 연결을 기반으로 한 보고서에 액세스하는 사용자가 즉시 사용할 수 있습니다.Any changes in the data after processing the model would be immediately available for the users who are accessing the report is based on live connection from the Power BI service.