Dynamische M-Abfrageparameter in Power BI Desktop
In diesem Artikel wird das Erstellen und Arbeiten mit dynamischen M-Abfrageparametern in Power BI Desktop beschrieben. Mit dynamischen M-Abfrageparametern können Modellautoren die Filter- oder Slicerwerte konfigurieren, die Berichts-Viewer für einen M-Abfrageparameter verwenden können. Mit dynamischen M-Abfrageparametern haben Modellautoren mehr Kontrolle darüber, wie ausgewählte Filter in Abfragen der DirectQuery-Quelle integriert werden.
Modellautoren verstehen die beabsichtigte Semantik ihrer Filter und wissen oft, wie effiziente Abfragen für ihre Datenquelle geschrieben werden. Mit dynamischen M-Abfrageparametern können Modellautoren sicherstellen, dass Filterauswahlen am richtigen Punkt in Quellabfragen integriert werden, um die gewünschten Ergebnisse mit optimaler Leistung zu erzielen. Dynamische M-Abfrageparameter können besonders nützlich für die Optimierung der Abfrageleistung sein.
Sehen Sie sich an, wie Sujata dynamische M-Abfrageparameter im folgenden Video erklärt und verwendet, und testen Sie sie dann selbst.
Hinweis
In diesem Video werden möglicherweise frühere Versionen von Power BI Desktop oder des Power BI-Diensts verwendet.
Voraussetzungen
Um diese Prozeduren zu bearbeiten, benötigen Sie eine gültige M-Abfrage , die mindestens eine DirectQuery-Tabelle verwendet.
Erstellen und Verwenden dynamischer Parameter
Im folgenden Beispiel wird ein einzelner Wert dynamisch an einen Parameter übergeben.
Hinzufügen von Parametern
Wählen Sie in Power BI Desktop die Option Start>Daten transformieren>Daten transformieren aus, um den Power Query-Editor zu öffnen.
Wählen Sie im Power Query-Editor im Menüband unter Parameter verwalten die Option Neue Parameter aus.
Geben Sie im Fenster Parameter verwalten die Informationen zum Parameter ein. Weitere Informationen finden Sie unter Erstellen eines Parameters.
Wählen Sie Neu aus, um weitere Parameter hinzuzufügen.
Wenn Sie mit dem Hinzufügen der Parameter fertig sind, wählen SieOK.
Verweisen auf die Parameter in der M-Abfrage
Nachdem Sie die Parameter erstellt haben, können Sie in der M-Abfrage darauf verweisen. Um die M-Abfrage zu ändern, öffnen Sie den erweiterten Editor bei ausgewählter Abfrage.
Verweisen Sie anschließend in der M-Abfrage auf die Parameter, die in der folgenden Abbildung gelb hervorgehoben sind.
Wenn Sie mit der Bearbeitung der Abfrage fertig sind, wählen Sie Fertig aus.
Erstellen von Wertetabellen
Erstellen Sie eine Tabelle für jeden Parameter mit einer Spalte, die die möglichen Werte bereitstellt, die basierend auf der Filterauswahl dynamisch festgelegt werden können. In diesem Beispiel sollen die StartTime
Parameter und EndTime
dynamisch sein. Da diese Parameter einen Date/Time
Parameter erfordern, generieren Sie die möglichen Eingaben, um das Datum für den Parameter dynamisch festzulegen.
Wählen Sie im Menüband von Power BI Desktop unter Modellierung die Option Neue Tabelle aus.
Erstellen Sie eine Tabelle für die Werte des
StartTime
Parameters, z. B.:StartDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Erstellen Sie eine zweite Tabelle für die Werte des
EndTime
Parameters, z. B.:EndDateTable = CALENDAR (DATE(2016,1,1), DATE(2016,12,31))
Hinweis
Verwenden Sie einen Spaltennamen, der sich nicht in einer tatsächlichen Tabelle befindet. Wenn Sie denselben Namen wie eine tatsächliche Tabellenspalte verwenden, gilt der ausgewählte Wert als Filter in der Abfrage.
Binden der Felder an die Parameter
Nachdem die Tabellen mit dem Feld Date
erstellt wurden, können die einzelnen Felder an einen Parameter gebunden werden. Das Binden eines Felds an einen Parameter bedeutet, dass der Wert beim Ändern des ausgewählten Feldwerts an den Parameter übergeben wird und die Abfrage aktualisiert wird, die auf den Parameter verweist.
Um ein Feld zu binden, wählen Sie in der Ansicht Power BI Desktop Modell das neu erstellte Feld aus, und wählen Sie im Bereich Eigenschaften die Option Erweitert aus.
Hinweis
Der Spaltendatentyp sollte mit dem M-Parameterdatentyp übereinstimmen.
Wählen Sie die Dropdownliste unter An Parameter binden und dann den Parameter aus, der an das Feld gebunden werden soll:
Da es sich in diesem Beispiel um die Einstellung des Parameters auf einen einzigen Wert handelt, lassen Sie die Mehrfachauswahl auf Nein eingestellt, was die Standardeinstellung ist:
Wenn die zugeordnete Spalte unter Mehrfachauswahl auf Nein festgelegt ist, müssen Sie entweder einen Einfachauswahlmodus im Slicer verwenden oder die Einfachauswahl in der Filterkarte festlegen.
Wenn Ihre Anwendungsfälle mehrere Werte an einen einzelnen Parameter übergeben müssen, legen Sie das Steuerelement auf Ja fest, und stellen Sie sicher, dass Ihre M-Abfrage so eingerichtet ist, dass mehrere Werte akzeptiert werden. Es folgt ein Beispiel für
RepoNameParameter
, bei dem mehrere Werte zulässig sind:Sie können diese Schritte wiederholen, wenn Sie andere Felder an andere Parameter binden möchten:
Schließlich können Sie das Feld in einem Slicer oder als Filter referenzieren:
Aktivieren von „Alle auswählen“
In diesem Beispiel verfügt das Power BI Desktop-Modell über ein Feld mit dem Namen Country, bei dem es sich um eine Liste von Ländern/Regionen handelt, die an einen M-Parameter namens countryNameMParameter gebunden sind. Dieser Parameter ist für die Option Mehrfachauswahl aktiviert, nicht jedoch für die Option Alle auswählen. Führen Sie die folgenden hinzugefügten Schritte aus, um die Option Alle auswählen in einem Datenschnitt oder einer Filterkarte verwenden zu können:
So aktivieren Sie Alle auswählen für Land:
Aktivieren Sie in den Erweiterten Eigenschaften für Land die Umschaltfläche Alle auswählen , wodurch die Eingabe Alle Wert auswählen aktiviert wird. Bearbeiten Sie den Wert Alle auswählen, oder notieren Sie sich den Standardwert.
Der Select All-Wert wird an den Parameter als Liste übergeben, die den von Ihnen definierten Wert enthält. Wenn Sie also diesen Wert definieren oder den Standardwert verwenden, stellen Sie sicher, dass der Wert eindeutig ist und nicht in dem Feld existiert, das an den Parameter gebunden ist.
Starten Sie die Power Query-Editor, wählen Sie die Abfrage aus, und wählen Sie dann Erweiterter Editor aus. Bearbeiten Sie die M-Abfrage so, dass der Wert Alles auswählen auf die Option Alles auswählen verweist.
Fügen Sie im Erweiterten Editor einen booleschen Ausdruck hinzu,
true
der als TRUE ausgewertet wird, wenn der Parameter für Mehrfachauswahl aktiviert ist und den Select All-Wert enthält (andernfalls wird FALSE zurückgegeben).false
Anschließend müssen Sie das Ergebnis des booleschen Ausdrucks für Alle auswählen in die Quellabfrage integrieren. In diesem Beispiel ist der boolesche Abfrageparameter in der Quellabfrage mit dem Namen
includeAllCountries
auf das Ergebnis des booleschen Ausdrucks aus dem vorherigen Schritt festgelegt. Sie können diesen Parameter in einer Filterklausel in der Abfrage verwenden, so dassfalse
für die booleschen Filter auf die ausgewählten Länder- oder Regionsnamen angewendet wird undtrue
effektiv kein Filter angewendet wird.Nachdem Sie Ihre M-Abfrage zur Berücksichtigung des neuen Select All-Werts aktualisiert haben, können Sie die Funktion Alle auswählen nun in Slicern oder Filtern verwenden:
Hier ist die vollständige Abfrage für das vorherige Beispiel:
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ögliches Sicherheitsrisiko
Berichtleseberechtigte, die die Werte für M-Abfrageparameter dynamisch festlegen können, können möglicherweise mithilfe von Einschleusungsangriffen auf weitere Daten zugreifen oder Änderungen am Quellsystem auslösen. Diese Möglichkeit hängt davon ab, wie Sie auf die Parameter in der M-Abfrage verweisen und welche Werte Sie an die Parameter übergeben.
Angenommen, Sie haben eine parametrisierte Kusto-Abfrage wie die folgende erstellt:
Products
| where Category == [Parameter inserted here] & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
Möglicherweise treten keine Probleme bei einem Friendly User auf, der einen geeigneten Wert für den Parameter übergibt, z. B. Games
:
| where Category == 'Games' & HasReleased == 'True'
Ein Angreifer kann jedoch unter Umständen einen Wert übergeben, der die Abfrage ändert, um Zugriff auf weitere Daten zu erhalten, z. B. 'Games'//
:
Products
| where Category == 'Games'// & HasReleased == 'True'
| project ReleaseDate, Name, Category, Region
In diesem Beispiel kann der Angreifer Zugriff auf Informationen zu Spielen erhalten, die noch nicht veröffentlicht wurden, indem er einen Teil der Abfrage in einen Kommentar umwandelt.
Verringern des Risikos
Zur Verringerung des Sicherheitsrisikos empfiehlt es sich, eine Zeichenfolgenverkettung von M-Parameterwerten in der Abfrage zu vermeiden. Verwenden Sie stattdessen die Parameterwerte in M-Vorgängen, die unter die Quellabfrage gefaltet werden, damit die M-Engine und der Connector die endgültige Abfrage erstellen.
Wenn eine Datenquelle den Import gespeicherter Prozeduren unterstützt, sollten Sie Ihre Abfragelogik dort speichern und in der M-Abfrage aufrufen. Alternativ können Sie einen in die Quellabfragesprache und in die Connectors integrierten Mechanismus zur Parameterübergabe verwenden, sofern ein solcher vorhanden ist. Azure Data Explorer enthält beispielsweise integrierte Abfrageparameterfunktionen für den Schutz vor Angriffen durch Einschleusung.
Hier sind einige Beispiele für diese Risikominderungen:
Beispiel, das die Filtervorgänge der M-Abfrage verwendet:
Table.SelectRows(Source, (r) => r[Columns] = Parameter)
Beispiel für das Deklarieren des Parameters in der Quellabfrage (oder das Übergeben des Parameterwerts als Eingabe für eine Quellabfragefunktion):
declare query_parameters (Name of Parameter : Type of Parameter);
Beispiel für den direkten Aufruf einer gespeicherten Prozedur:
let CustomerByProductFn = AzureDataExplorer.Contents("Help", "ContosoSales"){[Name="CustomerByProduct"]}[Data] in CustomerByProductFn({1, 3, 5})
Überlegungen und Einschränkungen
Bei der Verwendung von dynamischen M-Abfrageparametern sind einige Überlegungen und Einschränkungen zu berücksichtigen:
- Ein einzelner Parameter kann nicht an mehrere Felder gebunden werden oder umgekehrt.
- Dynamische M-Abfrageparameter unterstützen keine Aggregationen.
- Dynamische M-Abfrageparameter unterstützen keine Sicherheit auf Zeilenebene (Row-Level Security, RLS).
- Parameternamen dürfen keine reservierten DAX-Wörter (Data Analysis Expressions) sein oder Leerzeichen enthalten. Wenn Sie den Zusatz
Parameter
am Ende des Parameternamens anfügen, können Sie diese Einschränkung umgehen. - Tabellennamen darf keine Leer- oder Sonderzeichen enthalten.
- Wenn der Parameter vom Datentyp
Date/Time
ist, müssen Sie ihn innerhalb der M-Abfrage mitDateTime.Date(<YourDateParameter>)
umwandeln. - Wenn Sie SQL-Quellen verwenden, bemerken Sie möglicherweise bei jeder Änderung des Parameterwerts ein Bestätigungsdialogfeld. Dies liegt an einer Sicherheitseinstellung: Benutzergenehmigung für neue native Datenbankabfragen verlangen. Sie finden diese Einstellung auf der Registerkarte Sicherheit des Dialogfelds Optionen in Power BI Desktop, wo Sie sie deaktivieren können.
- Dynamische M-Abfrageparameter funktionieren unter Umständen nicht beim Zugriff auf ein Semantikmodell in Excel.
- Dynamische M-Abfrageparameter werden auf Power BI-Berichtsservern nicht unterstützt.
- Das Wechseln von Datenquellen mit dynamischen M-Abfrageparametern wird im Power BI-Dienst nicht unterstützt. Weitere Informationen finden Sie unter "Aktualisieren" und "Dynamische Datenquellen ".
Folgende vordefinierte Parametertypen werden nicht unterstützt:
- Any
- Duration
- Wahr/falsch
- Binary
Nicht unterstützte Filter
- Slicer oder Filter für relative Zeitbereiche
- Relatives Datum
- Hierarchieslicer
- Einschlussfilter für mehrere Felder
- Ausschlussfilter/NOT-Filter
- Übergreifende Hervorhebung
- Drilldown-Filter
- Crossdrill-Filter
- Top N-Filter
Nicht unterstützte Vorgänge
- Und
- Enthält
- Kleiner als
- Größer als
- Beginnt mit
- Beginnt nicht mit
- Ist nicht
- Enthält nicht
- Ist leer
- Ist nicht leer
Zugehöriger Inhalt
Weitere Informationen zu den Funktionen von Power BI Desktop finden Sie in den folgenden Ressourcen: