Power BI Desktop의 동적 M 쿼리 매개 변수

이 문서에서는 Power BI Desktop에서 동적 M 쿼리 매개 변수를 만들고 사용하는 방법을 설명합니다. 동적 M 쿼리 매개 변수를 사용하면 모델 작성자가 보고서 뷰어에서 M 쿼리 매개 변수에 사용할 수 있는 필터 또는 슬라이서 값을 구성할 수 있습니다. 동적 M 쿼리 매개 변수를 통해 모델 작성자는 DirectQuery 원본 쿼리에 통합할 필터 선택을 더 자세히 컨트롤할 수 있습니다.

모델 작성자는 필터의 의도된 의미 체계를 이해하며, 데이터 원본에 대한 효율적인 쿼리를 작성하는 방법을 알고 있는 경우가 많습니다. 동적 M 쿼리 매개 변수를 사용하여 모델 작성자는 필터 선택을 적절한 지점에서 원본 쿼리에 통합하여 최적의 성능으로 의도한 결과를 달성할 수 있습니다. 동적 M 쿼리 매개 변수는 쿼리 성능 최적화에 특히 유용할 수 있습니다.

다음 동영상에서 Sujata가 동적 M 쿼리 매개 변수에 대해 설명하고 직접 사용하는 것을 시청한 다음 직접 사용해 보세요.

참고 항목

이 비디오에서는 이전 버전의 Power BI Desktop 또는 Power BI 서비스를 사용할 수 있습니다.

필수 조건

절차를 수행하려면 하나 이상의 DirectQuery 테이블을 사용하는 유효한 M 쿼리 가 있어야 합니다.

동적 매개 변수 만들기 및 사용

다음 예제에서는 단일 값을 매개 변수에 동적으로 전달합니다.

매개 변수 추가

  1. Power BI Desktop에서 >데이터 변환>데이터 변환을 선택하여 Power 쿼리 편집기를 엽니다.

  2. Power Query 편집기의 리본에 있는 매개 변수 관리에서 새 매개 변수를 선택합니다.

    Screenshot that shows the Ribbon menu.

  3. 매개 변수 관리 창에서 매개 변수에 대한 정보를 입력합니다. 자세한 내용은 매개 변수 만들기를 참조하세요.

    Screenshot that shows parameter information.

  4. 새로 만들기를 선택하여 매개 변수를 더 추가합니다.

    Screenshot that shows New to create another parameter.

  5. 매개 변수 추가를 마치면 확인을 선택합니다.

M 쿼리에서 매개 변수 참조

  1. 매개 변수를 만든 후에는 M 쿼리에서 해당 매개 변수를 참조할 수 있습니다. M 쿼리를 수정하려면 쿼리를 선택한 상태에서 고급 편집기를 엽니다.

    Screenshot that shows opening the Advanced Editor.

  2. 다음 이미지에서 노란색으로 강조 표시된 대로 M 쿼리의 매개 변수를 참조합니다.

    Screenshot that shows referencing the parameter.

  3. 쿼리 편집이 완료되면 완료를 선택합니다.

값 테이블 만들기

필터 선택에 따라 동적으로 설정할 수 있는 값을 제공하는 열을 포함하여 각 매개 변수에 대한 테이블을 만듭니다. 이 예제에서는 StartTimeEndTime 매개 변수를 동적으로 설정하고자 합니다. 이와 같은 매개 변수에는 Date/Time 매개 변수가 필요하므로 해당 매개 변수의 날짜를 동적으로 설정할 수 있는 입력을 생성합니다.

  1. Power BI Desktop 리본의 모델링에서 새 테이블을 선택합니다.

    Screenshot that shows selecting New table.

  2. StartTime 매개 변수 값에 대한 테이블을 만듭니다. 예를 들면 다음과 같습니다.

    StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))

    Screenshot that shows the first table.

  3. EndTime 매개 변수 값에 대한 두 번째 테이블을 만듭니다. 예를 들면 다음과 같습니다.

    EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))

    Screenshot that shows the second table.

    참고 항목

    실제 테이블에 없는 열 이름을 사용합니다. 실제 테이블 열과 동일한 이름을 사용하는 경우 선택한 값이 쿼리의 필터로 적용됩니다.

필드를 매개 변수에 바인딩

Date 필드가 있는 테이블을 만들었으므로 각 필드를 매개 변수에 바인딩할 수 있습니다. 필드를 매개 변수에 바인딩하면 선택한 필드 값이 변경될 때 값이 매개 변수로 전달되고 매개 변수를 참조하는 쿼리가 업데이트됩니다.

  1. 필드를 바인딩하려면 Power BI Desktop 모델 보기에서 새로 만든 필드를 선택하고 속성 창에서 고급을 선택합니다.

    참고 항목

    열 데이터 형식은 M 매개 변수 데이터 형식과 일치해야 합니다.

    Screenshot that shows binding the field to a parameter.

  2. 매개 변수에 바인딩에서 드롭다운을 선택하고, 필드에 바인딩하려는 매개 변수를 선택합니다.

    Screenshot that shows binding the parameter to the field.

    이 예제는 매개 변수를 단일 값에 설정하기 위한 것이므로 다중 선택 설정을 기본값인 아니요로 유지합니다.

    Screenshot that shows multi-select set to No.

    매핑된 열의 다중 선택아니요로 설정된 경우 슬라이서에서 단일 선택 모드를 사용하거나 필터 카드에서 단일 선택을 요구해야 합니다.

    사용 사례에서 여러 값을 단일 매개 변수에 전달하는 것을 요구하는 경우 컨트롤을 로 설정하고 M 쿼리가 여러 값을 허용하도록 설정되어 있는지 확인합니다. 다음은 여러 값을 허용하는 RepoNameParameter의 예제입니다.

    Screenshot that shows a multivalue example.

  3. 다른 매개 변수에 바인딩할 다른 필드가 있는 경우 다음 단계를 반복합니다.

    Screenshot that shows configuring more parameters.

이제 이 필드를 슬라이서에서 또는 필터로 참조할 수 있습니다.

Screenshot that shows referencing the fields.

모두 선택 사용

이 예제에서 Power BI Desktop 모델에는 countryNameMParameter라는 M 매개 변수에 바인딩된 국가/지역 목록인 Country라는 필드가 있습니다. 이 매개 변수는 다중 선택에 대해 사용하도록 설정되어 있지만 모두 선택에 대해서는 사용하도록 설정되어 있지 않습니다. 슬라이서 또는 필터 카드에서 모두 선택 옵션을 사용하려면 다음 추가 단계를 수행합니다.

Screenshot that shows an example of a multiselect M parameter.

Country에 대해 모두 선택을 사용하도록 설정하려면 다음을 수행합니다.

  1. Country고급 속성에서 모두 선택 토글을 사용하도록 설정하여 모든 값 선택 입력을 사용하도록 설정합니다. 모든 값 선택을 편집하거나 기본값을 적어 둡니다.

    Screenshot that shows Select all for an M parameter.

    모든 값 선택 은 정의한 값이 포함된 목록으로 매개 변수에 전달됩니다. 따라서 이 값을 정의하거나 기본값을 사용하는 경우 이 값이 고유한지와 해당 매개 변수에 바인딩된 필드에 존재하지 않는지 확인해야 합니다.

  2. Power Query 편집기를 시작하고 쿼리를 선택한 다음 고급 편집기를 선택합니다. M 쿼리를 편집하여 모든 값 선택을 사용해 모두 선택 옵션을 참조합니다.

    Screenshot that shows an M query.

  3. 고급 편집기에서 매개 변수가 다중 선택에 대해 활성화되어 있고 모든 값 선택을 포함하는 경우 true로 평가되는 부울 식을 추가합니다. 그러지 않을 경우 false가 반환됩니다.

    Screenshot that shows an example Boolean expression for Select all.

  4. 모두 선택 부울 식의 결과를 원본 쿼리에 통합합니다. 이 예제에서는 이전 단계의 부울 식 결과로 설정된 includeAllCountries라는 부울 쿼리 매개 변수가 원본 쿼리에 있습니다. 쿼리의 필터 절에서 이 매개 변수를 사용할 수 있습니다. 부울 값이 false이면 선택한 국가 또는 지역 이름으로 필터링하고, true이면 결과적으로 필터를 적용하지 않습니다.

    Screenshot that shows the Select all Boolean used in the source query.

  5. 새로운 모든 값 선택을 고려하기 위해 M 쿼리를 업데이트한 후에는 슬라이서 또는 필터에서 모두 선택 함수를 사용할 수 있습니다.

    Screenshot that shows Select all in a slicer.

참고로 앞의 예제에 대한 전체 쿼리는 다음과 같습니다.

let
    selectedcountryNames = if Type.Is(Value.Type(countryNameMParameter), List.Type) then 
      Text.Combine({"'", Text.Combine(countryNameMParameter, "','") , "'"})
    else
      Text.Combine({"'" , countryNameMParameter , "'"}),

    selectAllCountries = if Type.Is(Value.Type(countryNameMParameter), List.Type) then 
      List.Contains(countryNameMParameter, "__SelectAll__")
    else
      false,

    KustoParametersDeclareQuery = Text.Combine({"declare query_parameters(", 
                                 "startTimep:datetime = datetime(", DateTime.ToText(StartTimeMParameter, "yyyy-MM-dd hh:mm"), "), " , 
                                 "endTimep:datetime = datetime(", DateTime.ToText(EndTimeMParameter, "yyyy-MM-dd hh:mm:ss"), "), ",   
                                 "includeAllCountries: bool = ", Logical.ToText(selectAllCountries) ,",",
                                 "countryNames: dynamic = dynamic([", selectedcountryNames, "]));" }),

   ActualQueryWithKustoParameters = 
                                "Covid19
                                | where includeAllCountries or Country in(countryNames)
                                | where Timestamp > startTimep and Timestamp < endTimep
                                | summarize sum(Confirmed) by Country, bin(Timestamp, 30d)",

    finalQuery = Text.Combine({KustoParametersDeclareQuery, ActualQueryWithKustoParameters}),

    Source = AzureDataExplorer.Contents("help", "samples", finalQuery, [MaxRows=null, MaxSize=null, NoTruncate=null, AdditionalSetStatements=null]),
    #"Renamed Columns" = Table.RenameColumns(Source,{{"Timestamp", "Date"}, {"sum_Confirmed", "Confirmed Cases"}})
in
    #"Renamed Columns"

잠재적 보안 위험

M 쿼리 매개 변수의 값을 동적으로 설정할 수 있는 보고서 구독자는 삽입 공격을 사용하여 더 많은 데이터에 액세스하거나 원본 시스템에 대한 수정을 트리거할 수 있습니다. 이 가능성은 M 쿼리에서 매개 변수를 참조하는 방법과 매개 변수에 전달하는 값에 따라 달라집니다.

예를 들어 다음과 같이 생성된 매개 변수가 있는 Kusto 쿼리가 있다고 가정해 보겠습니다.

Products
| where Category == [Parameter inserted here] & HasReleased == 'True'
 | project ReleaseDate, Name, Category, Region

적절한 매개 변수 값(예: Games)을 전달하는 우호적인 사용자의 경우 문제가 없습니다.

| where Category == 'Games' & HasReleased == 'True'

그러나 공격자는 다음과 같이 쿼리를 수정하는 값을 전달하여 더 많은 데이터에 액세스할 수 있습니다(예: 'Games'//).

Products
| where Category == 'Games'// & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region

이 예제에서 공격자는 쿼리의 일부를 주석으로 변경하여 아직 릴리스되지 않은 게임 정보에 대한 액세스 권한을 얻을 수 있습니다.

위험 완화

보안 위험을 완화하려면 쿼리 내에서 M 매개 변수 값의 문자열 연결을 피합니다. 그 대신 M 엔진 및 커넥터가 최종 쿼리를 구성하도록 원본 쿼리를 폴딩하는 M 작업에서 이러한 매개 변수 값을 사용하세요.

데이터 원본이 저장 프로시저 가져오기를 지원하는 경우 쿼리 논리를 거기에 저장하고 M 쿼리에서 호출하는 것이 좋습니다. 또는 사용 가능한 경우 원본 쿼리 언어 및 커넥터에 기본 제공되는 매개 변수 전달 메커니즘을 사용합니다. 예를 들어 Azure Data Explorer는 삽입 공격을 차단하도록 설계된 쿼리 매개 변수 기능이 기본 제공됩니다.

다음은 위험 완화의 몇 가지 예제입니다.

  • M 쿼리의 필터링 작업을 사용하는 예제:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • 원본 쿼리에서 매개 변수를 선언하거나 매개 변수 값을 원본 쿼리 함수에 입력으로 전달하는 예제:

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • 저장 프로시저를 직접 호출하는 예제:

    let CustomerByProductFn = AzureDataExplorer.Contents("Help", "ContosoSales"){[Name="CustomerByProduct"]}[Data] in
    CustomerByProductFn({1, 3, 5})
    

고려 사항 및 제한 사항

다음은 동적 M 쿼리 매개 변수를 사용할 때 생각해야 할 몇 가지 고려 사항 및 제한 사항입니다.

  • 한 매개 변수를 여러 필드에 바인딩할 수 없으며 그 반대의 경우도 마찬가지입니다.
  • 동적 M 쿼리 매개 변수는 집계를 지원하지 않습니다.
  • 동적 M 쿼리 매개 변수는 RLS(행 수준 보안)를 지원하지 않습니다.
  • 매개 변수 이름은 DAX(데이터 분석 식) 예약어가 될 수 없고 공백을 포함할 수도 없습니다. 매개 변수 이름의 끝에 Parameter를 추가하면 해당 제한을 피할 수 있습니다.
  • 테이블 이름에는 공백이나 특수 문자가 포함될 수 없습니다.
  • 매개 변수가 Date/Time 데이터 형식인 경우 M 쿼리 내에서 DateTime.Date(<YourDateParameter>)로 캐스팅해야 합니다.
  • SQL 원본을 사용하는 경우 매개 변수 값이 변경될 때마다 확인 대화 상자가 표시될 수 있습니다. 해당 대화 상자는 새 원시 데이터베이스 쿼리에 대해 사용자 승인 필요라는 보안 설정으로 인해 표시됩니다. Power BI Desktop 옵션보안 섹션에서 이 설정을 찾아서 끌 수 있습니다.
  • Excel에서 의미 체계 모델에 액세스할 때 동적 M 쿼리 매개 변수가 작동하지 않을 수 있습니다.
  • 동적 M 쿼리 매개 변수는 Power BI Report Server에서 지원되지 않습니다.

지원되지 않는 기본 매개 변수 형식

  • 모두
  • Duration
  • 참/거짓
  • 이진

지원되지 않는 필터

  • 상대 시간 슬라이서 또는 필터
  • 상대 날짜
  • 계층 슬라이서
  • 다중 필드 포함 필터
  • 제외 필터/미해당 필터
  • 교차 강조 표시
  • 드릴다운 필터
  • 크로스 드릴 필터
  • 상위 N 필터

지원되지 않는 작업

  • And
  • 포함
  • 보다 작음
  • 보다 큼
  • 다음으로 시작
  • 다음으로 시작하지 않음
  • 다음이 아님
  • 포함하지 않음
  • 비어 있음
  • 비어 있지 않음

Power BI Desktop의 기능에 대한 자세한 내용은 다음 리소스를 확인하세요.