Dynamické parametry dotazu M v Power BI Desktop

Tento článek popisuje, jak vytvořit a pracovat s dynamickými parametry dotazu M v Power BI Desktop. Pomocí dynamických parametrů dotazu M můžou autoři modelů nakonfigurovat hodnoty filtru nebo průřezu, které můžou čtenáři sestavy použít pro parametr dotazu M. Dynamické parametry dotazu M poskytují autorům modelů větší kontrolu nad výběry filtrů, které je možné začlenit do dotazů na zdroje DirectQuery.

Autoři modelů rozumí zamýšlené sémantice svých filtrů a často vědí, jak psát efektivní dotazy na zdroj dat. S dynamickými parametry dotazů M můžou autoři modelů zajistit, aby se výběry filtrů začlenily do zdrojových dotazů ve správném bodě, aby se dosáhlo zamýšlených výsledků s optimálním výkonem. Dynamické parametry dotazu M můžou být zvlášť užitečné pro optimalizaci výkonu dotazů.

Podívejte se, jak Sujata vysvětluje a používá dynamické parametry dotazu M v následujícím videu a pak je vyzkoušejte sami.

Poznámka

Toto video může používat starší verze Power BI Desktop nebo služba Power BI.

Požadavky

Pokud chcete tyto postupy projít, musíte mít platný dotaz M , který používá jednu nebo více tabulek DirectQuery.

Vytvoření a použití dynamických parametrů

Následující příklad dynamicky předává jednu hodnotu parametru.

Přidání parametrů

  1. V Power BI Desktop otevřete Editor Power Query výběrem možnosti Domovská>transformace dat>Transformovat data.

  2. V Editor Power Query vyberte na pásu karet v části Spravovat parametrymožnost Nové parametry.

    Snímek obrazovky s nabídkou pásu karet

  3. V okně Spravovat parametry vyplňte informace o parametru . Další informace najdete v tématu Vytvoření parametru.

    Snímek obrazovky s informacemi o parametrech

  4. Vyberte Nový a přidejte další parametry.

    Snímek obrazovky znázorňující nový pro vytvoření dalšího parametru

  5. Po přidání parametrů vyberte OK.

Odkazování na parametry v dotazu M

  1. Jakmile vytvoříte parametry, můžete na ně odkazovat v dotazu M. Pokud chcete upravit dotaz M, když máte vybraný dotaz, otevřete rozšířený editor.

    Snímek obrazovky znázorňující otevření Rozšířený editor

  2. Odkazujte na parametry v dotazu M, jak je zvýrazněno žlutě na následujícím obrázku:

    Snímek obrazovky znázorňující odkazování na parametr

  3. Po dokončení úprav dotazu vyberte Hotovo.

Vytvoření tabulek hodnot

Vytvořte tabulku pro každý parametr se sloupcem, který poskytuje možné hodnoty, které lze dynamicky nastavit na základě výběru filtru. V tomto příkladu StartTime chcete, aby parametry a EndTime byly dynamické. Vzhledem k tomu, že tyto parametry vyžadují Date/Time parametr, vygenerujete možné vstupy pro dynamické nastavení data parametru.

  1. Na pásu karet Power BI Desktop v části Modelování vyberte Nová tabulka.

    Snímek obrazovky znázorňující výběr možnosti Nová tabulka

  2. Vytvořte tabulku pro hodnoty parametru StartTime , například:

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

    Snímek obrazovky s první tabulkou

  3. Vytvořte druhou tabulku pro hodnoty parametru EndTime , například:

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

    Snímek obrazovky s druhou tabulkou

    Poznámka

    Použijte název sloupce, který není ve skutečné tabulce. Pokud použijete stejný název jako skutečný sloupec tabulky, vybraná hodnota použije v dotazu jako filtr.

Svázání polí s parametry

Teď, když jste vytvořili tabulky s Date poli, můžete každé pole svázat s parametrem. Vytvoření vazby pole na parametr znamená, že při změně hodnoty vybraného pole se hodnota předá parametru a aktualizuje dotaz, který na parametr odkazuje.

  1. Pokud chcete svázat pole, vyberte v zobrazení Power BI Desktop Model nově vytvořené pole a v podokně Vlastnosti vyberte Upřesnit.

    Poznámka

    Datový typ sloupce by měl odpovídat datovému typu parametru M.

    Snímek obrazovky znázorňující vazbu pole na parametr

  2. Vyberte rozevírací seznam v části Vytvořit vazbu k parametru a vyberte parametr, který chcete svázat s polem:

    Snímek obrazovky znázorňující vazbu parametru na pole

    Vzhledem k tomu, že tento příklad slouží k nastavení parametru na jednu hodnotu, ponechte možnost Vícenásobný výběr nastavenou na Hodnotu Ne, což je výchozí nastavení:

    Snímek obrazovky znázorňující vícenásobný výběr nastavený na Ne

    Pokud pro vícenásobný výběr nastavíte mapovaný sloupec na Hodnotu Ne, musíte použít režim jednoho výběru v průřezu nebo vyžadovat jeden výběr na kartě filtru.

    Pokud vaše případy použití vyžadují předání více hodnot jednomu parametru, nastavte ovládací prvek na Ano a ujistěte se, že je dotaz M nastavený tak, aby přijímal více hodnot. Tady je příklad pro RepoNameParameter, který umožňuje více hodnot:

    Snímek obrazovky znázorňující příklad s více hodnotami

  3. Tento postup opakujte, pokud máte další pole, která chcete svázat s jinými parametry.

    Snímek obrazovky znázorňující konfiguraci dalších parametrů

Na toto pole teď můžete odkazovat v průřezu nebo jako na filtr:

Snímek obrazovky znázorňující odkazování na pole

Povolit vybrat vše

V tomto příkladu má model Power BI Desktop pole s názvem Země, což je seznam zemí nebo oblastí vázaných na parametr M s názvem countryNameMParameter. Tento parametr je povolený pro vícenásobný výběr, ale není povolený pro možnost Vybrat vše. Pokud chcete na kartě průřezu nebo filtru použít možnost Vybrat vše , proveďte následující přidané kroky:

Snímek obrazovky znázorňující příklad parametru M s vícenásobným výběrem

Povolení možnosti Vybrat vše pro zemi:

  1. V části Upřesnitvlastnosti zeměpovolte přepínač Vybrat vše, který povolí vstup Vybrat vše. Upravte možnost Vybrat vše nebo si poznamenejte výchozí hodnotu.

    Snímek obrazovky znázorňující možnost Vybrat vše pro parametr M

    Hodnota Vybrat vše se předá parametru jako seznam obsahující vámi definovanou hodnotu. Proto když definujete tuto hodnotu nebo použijete výchozí hodnotu, ujistěte se, že je hodnota jedinečná a neexistuje v poli vázaném na parametr .

  2. Spusťte Editor Power Query, vyberte dotaz a pak vyberte Rozšířený editor. Upravte dotaz M tak, aby používal hodnotu Vybrat vše , která odkazuje na možnost Vybrat vše .

    Snímek obrazovky znázorňující dotaz M

  3. V Rozšířený editor přidejte logický výraz, který vyhodnotí, true jestli je parametr povolený pro vícenásobný výběr a obsahuje hodnotu Vybrat vše a v opačném případě vrátí false:

    Snímek obrazovky znázorňující příklad logického výrazu pro vybrat vše

  4. Začleňte výsledek výrazu Select all Boolean do zdrojového dotazu. Příklad obsahuje ve zdrojovém dotazu logický parametr dotazu s názvem includeAllCountries , který je nastavený na výsledek logického výrazu z předchozího kroku. Tento parametr můžete použít v klauzuli filtru v dotazu, například tak, aby false se pro logické hodnoty filtry vyfiltrovály názvy vybraných zemí nebo oblastí a true ve skutečnosti žádný filtr nepoužít.

    Snímek obrazovky znázorňující logickou hodnotu Select all logická hodnota použitá ve zdrojovém dotazu

  5. Po aktualizaci dotazu M tak, aby zohlednil novou hodnotu Vybrat vše, můžete v průřezech nebo filtrech použít funkci Vybrat vše .

    Snímek obrazovky znázorňující možnost Vybrat vše v průřezu

Tady je úplný dotaz pro předchozí příklad:

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"

Možné riziko zabezpečení

Čtenáři sestav, kteří můžou dynamicky nastavovat hodnoty parametrů dotazu M, můžou mít přístup k více datům nebo aktivovat úpravy zdrojového systému pomocí útoků prostřednictvím injektáže. Tato možnost závisí na tom, jak odkazujete na parametry v dotazu M a jaké hodnoty parametrům předáte.

Máte například parametrizovaný dotaz Kusto vytvořený takto:

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

Nejsou žádné problémy s popisným uživatelem, který předá odpovídající hodnotu parametru, Gamesnapříklad :

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

Útočníkovi se ale může podařit předat hodnotu, která upraví dotaz, aby získal přístup k dalším datům, 'Games'//například :

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

V tomto příkladu může útočník získat přístup k informacím o hrách, které ještě nebyly vydány, změnou části dotazu na komentář.

Zmírnění rizika

Pokud chcete zmírnit bezpečnostní riziko, vyhněte se v dotazu zřetězením hodnot parametrů M. Místo toho využijte tyto hodnoty parametrů v M operacích, které se přeloží na dotaz na zdroj, aby modul M a konektor vytvořily konečný dotaz.

Pokud zdroj dat podporuje import uložených procedur, zvažte uložení logiky dotazu tam a vyvolání v dotazu M. Případně pokud je k dispozici, použijte mechanismus předávání parametrů, který je integrovaný do zdrojového dotazovacího jazyka a konektorů. Například Azure Data Explorer obsahuje integrované funkce parametrů dotazů, které jsou určeny k ochraně před útoky prostřednictvím injektáže.

Tady je několik příkladů těchto zmírnění rizik:

  • Příklad, který používá operace filtrování dotazu M:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • Příklad, který deklaruje parametr ve zdrojovém dotazu nebo předává hodnotu parametru jako vstup funkci zdrojového dotazu:

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • Příklad přímého volání uložené procedury:

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

Důležité informace a omezení

Při použití dynamických parametrů dotazu M je potřeba vzít v úvahu několik aspektů a omezení:

  • Jeden parametr nemůže být vázán na více polí ani naopak.
  • Dynamické parametry dotazu M nepodporují agregace.
  • Dynamické parametry dotazu M nepodporují zabezpečení na úrovni řádků (RLS).
  • Názvy parametrů nesmí být rezervovaná slova jazyka DAX (Data Analysis Expressions) ani obsahovat mezery. Pokud se chcete tomuto omezení vyhnout, můžete ho připojit Parameter na konec názvu parametru.
  • Názvy tabulek nemůžou obsahovat mezery ani speciální znaky.
  • Pokud je vaším parametrem Date/Time datový typ, musíte ho v dotazu M přetypovat jako DateTime.Date(<YourDateParameter>).
  • Pokud používáte zdroje SQL, může se při každé změně hodnoty parametru zobrazit potvrzovací dialogové okno. Důvodem tohoto dialogového okna je nastavení zabezpečení: Vyžadovat schválení uživatele pro nové nativní databázové dotazy. Toto nastavení najdete a vypnete v části Zabezpečení v části Možnosti Power BI Desktop.
  • Dynamické parametry dotazu M nemusí při přístupu k datové sadě v Excelu fungovat.
  • Dynamické parametry dotazu M nejsou v Server sestav Power BI podporované.

Nepodporované předefinované typy parametrů

  • Všechny
  • Doba trvání
  • Pravda/nepravda
  • Binární

Nepodporované filtry

  • Průřez nebo filtr relativního času
  • Relativní datum
  • Průřez hierarchií
  • Filtr zahrnutí více polí
  • Vyloučit filtry / Nefiltry
  • Křížové zvýraznění
  • Filtr přechodu k podrobnostem
  • Filtr pro křížový přechod k podrobnostem
  • Filtr N nejlepších

Nepodporované operace

  • And
  • Contains
  • Menší než
  • Větší než
  • Začíná na
  • Nezačíná na
  • Není rovno
  • Neobsahuje
  • Je prázdné
  • Není prázdné

Další kroky

Další informace o možnostech Power BI Desktop najdete v následujících zdrojích informací: