Del via


Dynamiske M-forespørgselsparametre i Power BI Desktop

I denne artikel beskrives det, hvordan du opretter og arbejder med dynamiske M-forespørgselsparametre i Power BI Desktop. Med dynamiske M-forespørgselsparametre kan modelforfattere konfigurere de filter- eller udsnitsværdier, som rapportlæsere kan bruge til en M-forespørgselsparameter. Dynamiske M-forespørgselsparametre giver modelforfattere mere kontrol over de filtervalg, der skal inkorporeres i DirectQuery-kildeforespørgsler.

Modelforfattere forstår den tilsigtede semantik af deres filtre og ved ofte, hvordan de skriver effektive forespørgsler i forhold til deres datakilde. Med dynamiske M-forespørgselsparametre kan modelforfattere sikre, at filtervalg inkorporeres i kildeforespørgsler på det rigtige tidspunkt for at opnå de tilsigtede resultater med optimal ydeevne. Dynamiske M-forespørgselsparametre kan især være nyttige til optimering af forespørgselsydeevnen.

Se Sujata forklare og bruge dynamiske M-forespørgselsparametre i følgende video, og prøv dem derefter selv.

Bemærk

Denne video bruger muligvis tidligere versioner af Power BI Desktop eller Power BI-tjeneste.

Forudsætninger

Hvis du vil gennemgå disse procedurer, skal du have en gyldig M-forespørgsel , der bruger en eller flere DirectQuery-tabeller.

Opret og brug dynamiske parametre

I følgende eksempel overføres en enkelt værdi dynamisk til en parameter.

Tilføj parametre

  1. I Power BI Desktop skal du vælge Transformér data>til startsiden>Transformér data for at åbne Power Query-editor.

  2. I Power Query-editor skal du vælge Nye parametre under Administrer parametre på båndet.

    Skærmbillede, der viser menuen Bånd.

  3. Udfyld oplysningerne om parameteren i vinduet Administrer parametre. Du kan få flere oplysninger under Oprettelse af en parameter.

    Skærmbillede, der viser parameteroplysninger.

  4. Vælg Ny for at tilføje flere parametre.

    Skærmbillede, der viser Ny for at oprette en anden parameter.

  5. Når du er færdig med at tilføje parametre, skal du vælge OK.

Reference til parametrene i M-forespørgslen

  1. Når du har oprettet parametrene, kan du referere til dem i M-forespørgslen. Hvis du vil ændre M-forespørgslen, mens du har valgt forespørgslen, skal du åbne Avanceret editor.

    Skærmbillede, der viser åbning af Avanceret editor.

  2. Reference til parametrene i M-forespørgslen som fremhævet med gult på følgende billede:

    Skærmbillede, der viser reference til parameteren.

  3. Når du er færdig med at redigere forespørgslen, skal du vælge Udført.

Opret tabeller med værdier

Opret en tabel for hver parameter med en kolonne, der leverer de mulige værdier, der kan angives dynamisk baseret på filtervalg. I dette eksempel skal parametrene StartTime og EndTime være dynamiske. Da disse parametre kræver en Date/Time parameter, genererer du de mulige input for dynamisk at angive datoen for parameteren.

  1. På båndet i Power BI Desktop under Udformning skal du vælge Ny tabel.

    Skærmbillede, der viser, hvordan du vælger Ny tabel.

  2. Opret en tabel til værdierne i StartTime parameteren, f.eks.:

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

    Skærmbillede, der viser den første tabel.

  3. Opret en anden tabel for værdierne i EndTime parameteren, f.eks.:

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

    Skærmbillede, der viser den anden tabel.

    Bemærk

    Brug et kolonnenavn, der ikke findes i en faktisk tabel. Hvis du bruger det samme navn som en faktisk tabelkolonne, anvendes den valgte værdi som et filter i forespørgslen.

Bind felterne til parametrene

Nu, hvor du har oprettet tabellerne Date med felterne, kan du binde hvert felt til en parameter. Binding af et felt til en parameter betyder, at når den valgte feltværdi ændres, overføres værdien til parameteren og opdaterer den forespørgsel, der refererer til parameteren.

  1. Hvis du vil binde et felt, skal du vælge det nyoprettede felt i visningen Power BI Desktop-model og vælge Avanceret i ruden Egenskaber.

    Bemærk

    Kolonnedatatypen skal svare til M-parameterdatatypen.

    Skærmbillede, der viser binding af feltet til en parameter.

  2. Vælg rullelisten under Bind til parameter , og vælg den parameter, du vil binde til feltet:

    Skærmbillede, der viser binding af parameteren til feltet.

    Da dette eksempel er til angivelse af parameteren til en enkelt værdi, skal du holde Multi-select indstillet til Nej, hvilket er standarden:

    Skærmbillede, der viser, at flere markeringer er angivet til Nej.

    Hvis du angiver den tilknyttede kolonne til Nej for Flere markeringer, skal du bruge en enkelt markeringstilstand i udsnittet eller kræve enkelt markering på filterkortet.

    Hvis dine use cases kræver, at du overfører flere værdier til en enkelt parameter, skal du angive kontrolelementet til Ja og sørge for, at din M-forespørgsel er konfigureret til at acceptere flere værdier. Her er et eksempel på RepoNameParameter, som tillader flere værdier:

    Skærmbillede, der viser et eksempel med flere værdier.

  3. Gentag disse trin, hvis du har andre felter, der skal bindes til andre parametre.

    Skærmbillede, der viser konfiguration af flere parametre.

Du kan nu referere til dette felt i et udsnit eller som et filter:

Skærmbillede, der viser henvisninger til felterne.

Aktivér Markér alle

I dette eksempel har Power BI Desktop-modellen et felt med navnet Country, som er en liste over lande/områder, der er bundet til en M-parameter kaldet countryNameMParameter. Denne parameter er aktiveret for Flere markeringer, men er ikke aktiveret for Vælg alle. Hvis du vil kunne bruge indstillingen Vælg alle på et udsnits- eller filterkort, skal du udføre følgende tilføjede trin:

Skærmbillede, der viser et eksempel på en M-parameter med flere markeringer.

Sådan aktiverer du Vælg alle for Land:

  1. I avancerede egenskaber for Land skal du aktivere til/fra-knappen Vælg alle, som aktiverer inputtet Vælg alle værdier. Rediger værdien Vælg alle , eller bemærk standardværdien.

    Skærmbillede, der viser Vælg alle for en M-parameter.

    Værdien Select all overføres til parameteren som en liste, der indeholder den værdi, du har defineret. Når du definerer denne værdi eller bruger standardværdien, skal du derfor sørge for, at værdien er entydig og ikke findes i det felt, der er bundet til parameteren.

  2. Start Power Query-editor, vælg forespørgslen, og vælg derefter Avanceret editor. Rediger M-forespørgslen for at bruge værdien Vælg alle til at referere til indstillingen Vælg alle.

    Skærmbillede, der viser en M-forespørgsel.

  3. I Avanceret editor skal du tilføje et boolesk udtryk, der evalueres til true , hvis parameteren er aktiveret for Multi-select og indeholder værdien Select all og ellers returnerer false:

    Skærmbillede, der viser et eksempel på et boolesk udtryk for Vælg alle.

  4. Indarbejde resultatet af udtrykket Vælg alle booleske i kildeforespørgslen. Eksemplet har en boolesk forespørgselsparameter i kildeforespørgslen, der kaldes includeAllCountries , og som er angivet til resultatet af det booleske udtryk fra det forrige trin. Du kan bruge denne parameter i en filterdelsætning i forespørgslen, så false for de booleske filtre til de valgte lande- eller områdenavne og true effektivt anvender intet filter.

    Skærmbillede, der viser Vælg alle booleske elementer, der bruges i kildeforespørgslen.

  5. Når du har opdateret din M-forespørgsel, så den tager højde for den nye Select all-værdi, kan du bruge funktionen Vælg alle i udsnit eller filtre.

    Skærmbillede, der viser Vælg alle i et udsnit.

Her er den fulde forespørgsel for det foregående eksempel:

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"

Potentiel sikkerhedsrisiko

Rapportlæsere, der dynamisk kan angive værdierne for M-forespørgselsparametre, kan muligvis få adgang til flere data eller udløse ændringer af kildesystemet ved hjælp af injektionsangreb. Denne mulighed afhænger af, hvordan du refererer til parametrene i M-forespørgslen, og hvilke værdier du overfører til parametrene.

Du har f.eks. oprettet en Kusto-forespørgsel med parametre på følgende måde:

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

Der er ingen problemer med en brugervenlig bruger, der overfører en passende værdi for parameteren, Gamesf.eks.:

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

En hacker kan dog muligvis overføre en værdi, der ændrer forespørgslen for at få adgang til flere data, 'Games'//f.eks.:

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

I dette eksempel kan angriberen få adgang til oplysninger om spil, der endnu ikke er udgivet, ved at ændre en del af forespørgslen til en kommentar.

Reducer risikoen

Undgå strengsammenkædning af M-parameterværdier i forespørgslen for at afhjælpe sikkerhedsrisikoen. Brug i stedet de parameterværdier i M-handlinger, der foldes til kildeforespørgslen, så M-programmet og connectoren konstruerer den endelige forespørgsel.

Hvis en datakilde understøtter import af lagrede procedurer, kan du overveje at gemme din forespørgselslogik der og aktivere den i M-forespørgslen. Hvis det er muligt, kan du også bruge en mekanisme til parameteroverførsel, der er indbygget i kildeforespørgselssproget og -connectorerne. Azure Data Explorer har f.eks. indbyggede egenskaber for forespørgselsparametre, der er udviklet til at beskytte mod injektionsangreb.

Her er nogle eksempler på disse afhjælpninger:

  • Eksempel, der bruger M-forespørgslens filtreringshandlinger:

    Table.SelectRows(Source, (r) => r[Columns] = Parameter)
    
  • Eksempel, der deklarerer parameteren i kildeforespørgslen eller overfører parameterværdien som et input til en kildeforespørgselsfunktion:

    declare query_parameters (Name of Parameter : Type of Parameter);
    
  • Eksempel på direkte kald af en lagret procedure:

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

Overvejelser og begrænsninger

Der er nogle overvejelser og begrænsninger, du skal tage højde for, når du bruger dynamiske M-forespørgselsparametre:

  • En enkelt parameter kan ikke bindes til flere felter eller omvendt.
  • Dynamiske M-forespørgselsparametre understøtter ikke sammenlægninger.
  • Dynamiske M-forespørgselsparametre understøtter ikke sikkerhed på rækkeniveau .
  • Parameternavne må ikke være DAX-reserverede ord (Data Analysis Expressions) eller indeholde mellemrum. Du kan føje Parameter til slutningen af parameternavnet for at undgå denne begrænsning.
  • Tabelnavne må ikke indeholde mellemrum eller specialtegn.
  • Hvis din parameter er Date/Time datatypen, skal du angive den i M-forespørgslen som DateTime.Date(<YourDateParameter>).
  • Hvis du bruger SQL-kilder, får du muligvis en bekræftelsesdialogboks, hver gang parameterværdien ændres. Denne dialogboks skyldes en sikkerhedsindstilling: Kræv brugergodkendelse for nye oprindelige databaseforespørgsler. Du kan finde og deaktivere denne indstilling i afsnittet Sikkerhed i Indstillinger for Power BI Desktop.
  • Dynamiske M-forespørgselsparametre fungerer muligvis ikke, når du får adgang til en semantisk model i Excel.
  • Dynamiske M-forespørgselsparametre understøttes ikke på Power BI-rapportserver.
  • Skift af datakilder ved hjælp af dynamiske M-forespørgselsparametre understøttes ikke i Power BI-tjeneste. Se opdatering og dynamiske datakilder for at få flere oplysninger.

Ikke-understøttede standardparametertyper

  • Any
  • Varighed
  • Sand/Falsk
  • Binær

Ikke-understøttede filtre

  • Udsnitsværktøj eller filter for relativ tid
  • Relativ dato
  • Hierarkiudsnit
  • Medtag filter med flere felter
  • Udelad filtre/Ikke-filtre
  • Tværgående fremhævning
  • Detailudledningsfilter
  • Tværgående analysefilter
  • Top N-filter

Ikke-understøttede handlinger

  • And
  • Indeholder
  • Mindre end
  • Større end
  • Starter med
  • Starter ikke med
  • Er ikke
  • Indeholder ikke
  • Er tom
  • Er ikke tom

Du kan få flere oplysninger om funktioner i Power BI Desktop i følgende ressourcer: