Support formation Rapports Power BI

Niveaux de confidentialité et erreur Firewall

En bref

  • Objectifs : expliquer le rôle du pare-feu de confidentialité ; attribuer un niveau de confidentialité à une source ; corriger une erreur Formula.Firewall en restructurant les requêtes plutôt qu'en désactivant la protection.
  • Prérequis : pages « Fusionner des requêtes » et « Paramètres de requête ».
  • Niveau : avancé.

Pourquoi ?

Lorsqu'une requête combine deux sources, Power Query peut envoyer des données de l'une vers l'autre : la valeur lue dans un classeur interne peut par exemple finir dans l'URL d'un site web public. Le pare-feu de confidentialité empêche ces fuites involontaires. Il se manifeste par l'erreur Formula.Firewall, souvent rencontrée lors d'une fusion ou lorsqu'une requête utilise la valeur d'une autre requête comme paramètre de source.

Notions clés

Les niveaux de confidentialité

NiveauSignificationExemples
PrivéDonnées sensibles, visibles uniquement par les personnes autoriséesPaie, données personnelles
OrganisationnelDonnées visibles par les personnes de confiance de l'organisationFichiers SharePoint internes, base de données de l'entreprise
PublicDonnées accessibles à tousSite web public, données ouvertes
AucunAucun niveau défini ; à remplacer par l'un des trois précédents

Une source Privé ne peut pas être combinée avec une autre source ; deux sources Organisationnel, ou deux sources Public, peuvent l'être.

Le niveau se règle dans Fichier > Options et paramètres > Paramètres de la source de données (ou, dans l'éditeur, Accueil > Paramètres de la source de données) : sélectionnez la source, Modifier les autorisations, puis la liste Niveau de confidentialité. Source

[Capture : fenêtre Modifier les autorisations d'une source, liste Niveau de confidentialité déroulée sur Organisationnel]

Les partitions et les deux messages d'erreur

Pour contrôler les échanges, Power Query découpe les requêtes en partitions (groupes d'étapes). La règle est la suivante : une partition peut accéder à des sources de données compatibles, ou faire référence à d'autres partitions, mais pas les deux à la fois. Source

Deux messages en découlent (cités en anglais par Microsoft Learn, l'interface française les traduit) :

  • « La requête ... fait référence à d'autres requêtes ou étapes, elle ne peut donc pas accéder directement à une source de données » (references other queries or steps, so it may not directly access a data source) : une même étape lit une source et utilise une autre requête ;
  • « La requête ... accède à des sources de données dont les niveaux de confidentialité ne peuvent pas être utilisés ensemble » (is accessing data sources that have privacy levels which cannot be used together) : les niveaux sont incompatibles.

Lors d'une fusion, le symptôme est souvent un message de correspondance impossible à calculer dans la fenêtre Fusionner, puis un bandeau jaune Formula.Firewall après validation.

Les solutions, de la meilleure à la moins bonne

  1. Regrouper l'accès aux sources dans une seule requête : le pare-feu reste actif et les étapes sont dans la même partition.
  2. Attribuer des niveaux compatibles aux sources (par exemple Organisationnel pour toutes les sources internes) : corrige le second message.
  3. Ignorer les niveaux de confidentialité : Fichier > Options et paramètres > Options > Fichier actif > Confidentialité > Ignorer les niveaux de confidentialité et potentiellement améliorer les performances. Le pare-feu est désactivé pour ce fichier : à réserver aux sources sans aucune donnée sensible. L'option globale Toujours ignorer les paramètres de niveau de confidentialité est à éviter.

[Capture : Options, Fichier actif > Confidentialité, les trois choix de niveaux de confidentialité]

Exemple

Le cas suivant reproduit l'erreur : une requête Chemin lit une URL dans un tableau Excel (par « drill down » sur la cellule), et une requête CodeHTML utilise cette URL dans Web.BrowserContents.

image.png

Le tableau Excel qui contient l'URL :

image.png

La requête Chemin (le chemin du classeur est à adapter, celui de l'exemple est fourni par le formateur) :

let
    Source = Excel.Workbook(File.Contents("C:\Formation\PowerQuery_ErreurFirewall.xlsx"), null, true),
    Tableau1_Table = Source{[Item = "Tableau1", Kind = "Table"]}[Data],
    #"Type modifié" = Table.TransformColumnTypes(Tableau1_Table, {{"Chemin", type text}}),
    Chemin = #"Type modifié"{0}[Chemin]
in
    Chemin

La requête CodeHTML, qui déclenche l'erreur parce que son étape Source lit le web tout en faisant référence à la requête Chemin :

let
    Source = Web.BrowserContents(Chemin)
in
    Source

Solution 1 : intégrer la requête

Copiez le code de la requête Chemin (clic droit sur la requête > Copier) et collez-le dans CodeHTML, comme une variable MonChemin. Les deux accès aux sources se trouvent alors dans la même requête :

let
    // Ancienne requête Chemin, intégrée
    MonChemin =
        let
            Source = Excel.Workbook(File.Contents("C:\Formation\PowerQuery_ErreurFirewall.xlsx"), null, true),
            Tableau1_Table = Source{[Item = "Tableau1", Kind = "Table"]}[Data],
            #"Type modifié" = Table.TransformColumnTypes(Tableau1_Table, {{"Chemin", type text}}),
            Chemin = #"Type modifié"{0}[Chemin]
        in
            Chemin,
    Source = Web.BrowserContents(MonChemin)
in
    Source

Si les deux sources ont des niveaux incompatibles (classeur Privé, site Public), l'erreur persiste : attribuez des niveaux compatibles.

Solution 2 : transformer la requête en fonction sans argument

Autre contournement constaté par le formateur : faire renvoyer à la requête Chemin une fonction sans argument plutôt qu'une valeur (sans oublier la virgule à la fin de l'avant-dernière ligne) :

let
    Source = Excel.Workbook(File.Contents("C:\Formation\PowerQuery_ErreurFirewall.xlsx"), null, true),
    Tableau1_Table = Source{[Item = "Tableau1", Kind = "Table"]}[Data],
    #"Type modifié" = Table.TransformColumnTypes(Tableau1_Table, {{"Chemin", type text}}),
    Chemin = #"Type modifié"{0}[Chemin],
    MaFonction = () => Chemin
in
    MaFonction
image.png

La requête CodeHTML appelle alors Web.BrowserContents(Chemin()). Ce contournement ne figure pas dans la documentation Microsoft : préférez la solution 1, plus lisible.

Pièges et bonnes pratiques

  • Ne cochez pas Ignorer les niveaux de confidentialité par réflexe : vous supprimez une protection contre les fuites de données.
  • Définissez les niveaux dès la connexion à chaque nouvelle source, plutôt que de laisser Aucun.
  • Après publication, le niveau de confidentialité se définit aussi avec les informations d'identification de chaque source, dans le service Power BI ou sur la passerelle (partie 1).
  • Les niveaux de confidentialité ne sont pas disponibles dans les dataflows de Power Platform.

À retenir

  • Le pare-feu de confidentialité empêche qu'une source envoie des données à une autre sans contrôle.
  • Une partition accède à des sources ou fait référence à d'autres requêtes, jamais les deux.
  • Trois niveaux : Privé, Organisationnel, Public ; seules des sources de même niveau Organisationnel ou Public se combinent.
  • Corrigez d'abord en regroupant les accès dans une requête ou en harmonisant les niveaux ; n'ignorez les niveaux qu'en dernier recours.

Pour aller plus loin

  • Comprendre les erreurs Formula.Firewall. Source
  • Niveaux de confidentialité. Source