Zo zákulisia brány firewall na ochranu osobných údajov

Ak ste používali Power Query na ľubovoľnú dobu, pravdepodobne ste sa u vás vyskytoli. Okamžite dostanete dotazovanie, keď sa zobrazí chyba, ktorá sa nebude vyhľadať online, nebude možné napraviť ladenie dotazov alebo ladenie dotazov pomocou klávesnice. Chyba ako:

Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Alebo možno:

Formula.Firewall: Query 'Query1' (step 'Source') is accessing data sources that have privacy levels which cannot be used together. Please rebuild this data combination.

Tieto chyby sú výsledkom brány firewall Power Query ochrany osobných údajov (tiež brány firewall), akou sa niekedy môže zdať, že existuje len ako zneustrovať analytikov údajov na Formula.Firewall celom svete. Verte tomu alebo nie, brána firewall slúži na dôležitý účel. V tomto článku sa budeme deliť pod kapotou, aby sme lepšie pochopili, ako to funguje. Dúfame, že vďaka lepšiemu diagnostikovaniu a opraveniu chýb brány firewall budete v budúcnosti schopní lepšie rozumieť.

Čo je to?

Účel brány firewall ochrany osobných údajov je jednoduchý: existuje tak, aby zabránila Power Query neúmyselne únik údajov medzi zdrojmi.

Prečo je to potrebné? Určite by ste mohli vytvoriť nejaký kód M, ktorý by SQL hodnotou do informačného kanála OData. To by ale bolo zámerné únik údajov. Autor mashupu by mal (alebo aspoň mal) vedieť, že to robí. Prečo potom potrebujete ochranu pred neúmyselným únikom údajov?

Odpoveď? Skladacie.

Skladacie?

Skladanie je výraz, ktorý sa vzťahuje na konverziu výrazov v M (ako napríklad filtre, premenovania, spojenia a ďalšie) do operácií s nespracovým zdrojom údajov (napríklad SQL, OData a ďalšie). Veľkou súčasťou Power Query je skutočnosť, že PQ môže konvertovať operácie, ktoré používateľ vykonáva prostredníctvom používateľského rozhrania, do zložitých jazykov SQL alebo iných jazykov serverového zdroja údajov, bez toho, aby používateľ mal poznať uvedené jazyky. Používatelia môžu vďaka operáciám natívneho zdroja údajov využívať výhody natívneho zdroja údajov jednoducho pomocou používateľského rozhrania, v ktorom sa všetky zdroje údajov môžu transformovať pomocou bežných príkazov.

V rámci skladanie môže PQ niekedy zistiť, že najúčinnejší spôsob vykonanie danej mashupy je vziať údaje z jedného zdroja a preniesť ich do iného. Ak sa napríklad pripájate k malému súboru CSV s veľkou tabuľkou SQL, pravdepodobne nechcete, aby PQ čítala súbor CSV, prečítala celú SQL tabuľku a potom ich prepojili na lokálnom počítači. Zrejme chcete, aby PQ vnoriť údaje CSV do príkazového SQL a požiadať databázu SQL, aby vykoná spojenie.

Je to spôsob, ako môže dôjsť k neúmyselnému úniku údajov.

Predstavte si, ak ste sa pripojili k údajom, ktoré obsahovali čísla sociálneho zabezpečenia zamestnancov s výsledkami externého informačného kanála OData, SQL zrazu ste zistili, že čísla sociálneho zabezpečenia z SQL boli odoslané do služby OData. Zlé správy, nie?

Ide o typ scenára, pred ktorý je brána firewall určená na to, aby jej zabránila.

Ako to funguje?

Existuje brána firewall, ktorá zabráni neúmyselne odoslať údaje z jedného zdroja do iného zdroja. A je to jednoduché.

Ako sa tým na splnenie tejto úlohy uchýli?

Delí to M dotazy na oblasti, ktoré sa nazývajú, a potom vynechá nasledujúce pravidlo:

  • Oblasť môže pristupovať ku kompatibilným zdrojom údajov alebo odkazovať na iné oblasti, ale nie na obidva tieto.

Jednoduché... napriek tomu mätúce. Čo je oblasť? V čom sú dva zdroje údajov "kompatibilné"? A prečo by brána firewall mala na tom záleží, ak chce oblasť získať prístup k zdroju údajov a odkazovať na oblasť?

Poďme si to rozdeliť a pozrieme sa na pravidlo uvedené vyššie po jednom.

Čo je oblasť?

Na svojej najzákladnejšie úrovni je oblasť len kolekciou jedného alebo viacerých krokov dotazu. Najpodrobnejšie možné rozdelenie (aspoň v aktuálnej implementácii) je jedným krokom. Najväčšie oblasti môžu niekedy zahŕňať viacero dotazov. (Viac si o tom môžete urobiť neskôr.)

Ak kroky nepoznáte, môžete ich po výbere dotazu zobraziť napravo od okna editora Power Query na table Použité kroky. Kroky majú prehľad o tom, čo ste urobili, aby ste svoje údaje transformli do konečného tvaru.

Oblasti odkazu na iné oblasti

Pri vyhodnocovaní dotazu pomocou zapnutej brány firewall brána Firewall rozdelí dotaz a všetky jeho závislosti do oblastí (to znamená skupiny krokov). Vždy, keď jedna oblasť odkazuje na niečo v inej oblasti, brána Firewall nahradí odkaz volaniam špeciálnej funkcie s názvom Value.Firewall . Inými slovami, brána firewall nepovoľuje oblasti na náhodný prístup k sebe. Všetky odkazy sa upravia tak, aby prešli cez bránu firewall. Bránu firewall si môžete premyslieť ako vrátnik. Oblasť, ktorá odkazuje na inú oblasť, musí získať povolenie na to pomocou brány firewall a brána Firewall určuje, či budú odkazované údaje do oblasti povolené.

Toto všetko sa môže zdať dosť abstraktné, tak sa pozrime na príklad.

Predpokladajme, že máte dotaz s názvom Employees (Zamestnanci), ktorý vytiahne niektoré údaje z SQL údajov. Predpokladajme, že máte aj ďalší dotaz (EmployeesReference), ktorý jednoducho odkazuje na employees.

shared Employees = let
    Source = Sql.Database(…),
    EmployeesTable = …
in
    EmployeesTable;

shared EmployeesReference = let
    Source = Employees
in
    Source;

Tieto dotazy budú rozdelené do dvoch oblastí: jedna pre dotaz Employees (Zamestnanci) a jedna pre dotaz EmployeesReference (ZamestnanciReference), ktorá bude odkazovať na oblasť Employees (Zamestnanci). Pri vyhodnocovaní brány firewall pri použití týchto dotazov sa tieto dotazy prepíšu takto:

shared Employees = let
    Source = Sql.Database(…),
    EmployeesTable = …
in
    EmployeesTable;

shared EmployeesReference = let
    Source = Value.Firewall("Section1/Employees")
in
    Source;

Všimnite si, že jednoduchý odkaz na dotaz Employees (Zamestnanci) bol nahradený vola- hovoru , ktorý Value.Firewall poskytuje úplný názov dotazu Employees (Zamestnanci).

Keď sa vyhodnotí EmployeesReference, zachytí sa volanie , do ktorého zachytí brána firewall a ktorá teraz môže kontrolovať, či (a ako) toky požadovaných údajov do oblasti Value.Firewall("Section1/Employees") EmployeesReference. Môžete tak urobiť ľubovoľný počet vecí: zamietnuť požiadavku, do medzipamäte požadované údaje (čo zabráni ďalšiemu skladanie do pôvodného zdroja údajov), a tak ďalej.

Takto brána firewall udržiava kontrolu nad tokom údajov medzi oblasťami.

Oblasti, ktoré priamo pristupujú k zdrojom údajov

Povedzme, že definujete dotaz Query1 jedným krokom (všimnite si, že tento dotaz s jedným krokom bude zodpovedať jednej oblasti brány firewall) a že tento jeden krok pristupuje k dvom zdrojom údajov: SQL tabuľke databázy a súboru CSV. Ako sa s tým vysporiada brána firewall, pretože neexistuje žiadny odkaz na oblasť a preto nie je potrebné volať ho, aby Value.Firewall to zachytiť? Pozrime sa na pravidlo uvedené vyššie:

  • Oblasť môže pristupovať ku kompatibilným zdrojom údajov alebo odkazovať na iné oblasti, ale nie na obidva tieto.

Ak chcete povoliť spustenie dotazu s jedným ale dvomi zdrojmi údajov, musia byť jeho dva zdroje údajov "kompatibilné". Inými slovami, na to, aby sa medzi nimi zdieľali údaje, musí byť v poriadku. V súvislosti s rozhraním používateľského Power Query to znamená, že úrovne ochrany osobných údajov v službe SQL a CSV zdrojoch údajov musia byť verejné alebo obe musia byť organizačné. Ak sú obe označené ako Súkromné alebo je jeden označený ako verejný a jeden je označený ako Organizačné, alebo sú označené pomocou inej kombinácie úrovní ochrany osobných údajov, nie je bezpečné, aby sa obe vyhodnotili v rovnakej oblasti. To by mohlo znamenať, že by sa mohol vyskytnúť únik údajov (z dôvodu skladanie) a brána firewall by nemohla predísť.

Čo sa stane, ak sa pokúsite získať prístup k nekompatibilným zdrojom údajov v tej istej oblasti?

Formula.Firewall: Query 'Query1' (step 'Source') is accessing data sources that have privacy levels which cannot be used together. Please rebuild this data combination.

Dúfame, že vám teraz lepšie porozumiete niektorému z chybových hlásení uvedených na začiatku tohto článku.

Upozorňujeme, že táto požiadavka na kompatibilitu sa vzťahuje iba v rámci daného oblasti. Ak oblasť odkazuje na iné oblasti, zdroje údajov z odkazované oblasti nemusíte navzájom kompatibilné. Je to spôsobené tým, že brána firewall môže údaje do medzipamäte, čo zabráni ďalšiemu posunu v pôvodnom zdroji údajov. Údaje sa načítajú do pamäte a budú sa s nimi zaobchádzať, ako keby pochádzali z načítaní.

Prečo nevyhovuje obom?

Povedzme, že definujete dotaz s jedným krokom (ktorý bude opäť zodpovedať jednej oblasti), ktorý pristupuje k dvom ďalším dotazom (to znamená k dvom ďalším oblastim). Čo ak by ste chceli v tom istom kroku tiež priamo získať prístup k databáze SQL databáze? Prečo sa vám na oblasť nemôže odkazovať na iné oblasti a priamo získať prístup ku kompatibilným zdrojom údajov?

Ako ste videli skôr, keď jedna oblasť odkazuje na inú oblasť, brána firewall funguje ako vrátnik pre všetky údaje prúdiace do oblasti. Ak tak chcete urobiť, musí mať možnosť kontrolovať, v akých údajoch sa môžu nachádzať. Ak sa do oblasti pristupujú k zdrojom údajov a údaje prúdia z iných oblastí, stratí sa jej schopnosť byť vrátnikom, pretože tok údajov by sa mohol vytiecť do niektorého z interne pristupovať k zdrojom údajov bez toho, aby o ňom vedel. Brána firewall tak zabráni tomu, aby oblasť, ktorá pristupuje k iným oblastim, povolila priamy prístup k akýmkoľvek zdrojom údajov.

Takže čo sa stane, ak sa oblasť pokúsi odkazovať na iné oblasti a tiež priamo získať prístup k zdrojom údajov?

Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Dúfame, že teraz lepšie porozumiete chybovému hlásení, ktoré je uvedené na začiatku tohto článku.

Oblasti do hĺbky

Ako pravdepodobne dokážete z vyššie uvedených informácií odhadnúť, to, ako sú dotazy rozdeľované, končí neuveriteľne dôležité. Ak máte niekoľko krokov, ktoré odkazujú na iné dotazy a iné kroky, ktoré pristupujú k zdrojom údajov, dúfame, že dúfame, že na niektorých miestach nakreslenie hranice oblasti spôsobí chyby brány firewall a ich kreslenie na iných miestach umožní dotaz spustiť presne v poriadku.

Ako sa teda dotazy delia?

Táto časť je pravdepodobne najdôležitejšia pre pochopenie dôvodu zobrazuje chyby brány firewall a tiež na pochopenie ich riešenia (tam, kde je to možné).

Tu je súhrn logiky rozdelenia na vysokej úrovni.

  • Počiatočné rozdelenie
    • Vytvorí oblasť pre každý krok v každom dotaze.
  • Statická fáza
    • Táto fáza nezávisí od výsledkov hodnotenia. Namiesto toho sa spolieha na spôsob štruktúrovania dotazov.
    • Orezanie parametrov
      • Oreže oblasti parameter-esque, to znamená každú z nich:
        • Ne odkazuje na žiadne iné oblasti
        • Neobsahuje žiadne vyvolania funkcie
        • Nie je cyklická (to znamená, že sa ne odkazuje na samotnú)
      • Všimnite si, že "odstránenie" oblasti efektívne zahŕňa do akejkoľvek inej oblasti, na ktorú sa odkazuje.
      • Rozdelenie oblastí parametrov umožňuje odkazy na parametre použité v rámci volaní funkcie zdroja údajov (napríklad ), aby fungovali, namiesto toho, aby vrhla "oblasť nemôže odkazovať na zdroje údajov a iné Web.Contents(myUrl) kroky".
    • Zoskupenie (statické)
      • Oblasti sa zlúčia a zachová sa rozdelenie medzi:
        • Oblasti v rôznych dotazoch
        • Oblasti, ktoré odkazovať na iné oblasti alebo na tie, ktoré sa
  • Dynamická fáza
    • Táto fáza závisí od výsledkov hodnotenia vrátane informácií o zdrojoch údajov, ku nim majú prístup rôzne oblasti.
    • Orezávanie
      • Orechá oblasti, ktoré spĺňajú všetky nasledujúce požiadavky:
        • Nepristup k žiadnemu zdroju údajov
        • Neobsahuje odkaz na žiadne oblasti, ktoré pristupuje k zdrojom údajov
        • Nie je cyklická
    • Zoskupenie (dynamické)
      • Teraz, keď sú nepotrebné oblasti orezané, skúste vytvoriť čo možno najviac zdrojových oblastí.
      • Zlúčte všetky oblasti s ich vstupnými oblasťami, ak každý z jeho vstupov:
        • Je súčasťou toho istého dotazu
        • Ne odkazuje na žiadne iné oblasti
        • Odkazuje sa len na aktuálnu oblasť
        • Nie je výsledkom (t. j. posledný krok) dotazu
        • Nie je cyklická

Čo to všetko znamená?

Prejdme si príklad, ktorý ilustruje, ako funguje zložitá logika stanovená vyššie.

Tu je ukážkový scenár. Je to pomerne jednoduché zlúčenie textového súboru (Kontakty) s databázou programu SQL (Employees), kde SQL server je parameter (DbServer).

Tri dotazy

Tu je kód jazyka M pre tri dotazy použité v tomto príklade.

shared DbServer = "montegoref6" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true];
shared Contacts = let

    Source = Csv.Document(File.Contents("C:\contacts.txt"),[Delimiter="   ", Columns=15, Encoding=1252, QuoteStyle=QuoteStyle.None]),

    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),

    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"ContactID", Int64.Type}, {"NameStyle", type logical}, {"Title", type text}, {"FirstName", type text}, {"MiddleName", type text}, {"LastName", type text}, {"Suffix", type text}, {"EmailAddress", type text}, {"EmailPromotion", Int64.Type}, {"Phone", type text}, {"PasswordHash", type text}, {"PasswordSalt", type text}, {"AdditionalContactInfo", type text}, {"rowguid", type text}, {"ModifiedDate", type datetime}})

in

    #"Changed Type";
shared Employees = let

    Source = Sql.Databases(DbServer),

    AdventureWorks = Source{[Name="AdventureWorks"]}[Data],

    HumanResources_Employee = AdventureWorks{[Schema="HumanResources",Item="Employee"]}[Data],

    #"Removed Columns" = Table.RemoveColumns(HumanResources_Employee,{"HumanResources.Employee(EmployeeID)", "HumanResources.Employee(ManagerID)", "HumanResources.EmployeeAddress", "HumanResources.EmployeeDepartmentHistory", "HumanResources.EmployeePayHistory", "HumanResources.JobCandidate", "Person.Contact", "Purchasing.PurchaseOrderHeader", "Sales.SalesPerson"}),

    #"Merged Queries" = Table.NestedJoin(#"Removed Columns",{"ContactID"},Contacts,{"ContactID"},"Contacts",JoinKind.LeftOuter),

    #"Expanded Contacts" = Table.ExpandTableColumn(#"Merged Queries", "Contacts", {"EmailAddress"}, {"EmailAddress"})

in

    #"Expanded Contacts";

Tu je zobrazenie vyššej úrovne, ktoré zobrazuje závislosti.

Dialógové okno Závislosti dotazov.

Oblasť

Poďme si trochu priblížiť a zahrnúť kroky v obrázku a začnite prechádzať logikou rozdelenia. Tu je diagram troch dotazov, ktorý znázorňuje počiatočné oblasti brány firewall zelenou farbou. Všimnite si, že každý krok začína vo vlastnej oblasti.

Počiatočné oblasti brány firewall.

V ďalšom kroku orezáme oblasti parametrov. Preto sa DbServer implicitne zahrnie do zdrojovej oblasti.

Orezané oblasti brány firewall.

Teraz vykonávame statické zoskupenie. Takto sa udržiava rozdelenie medzi oblasťami v samostatných dotazoch (všimnite si napríklad, že posledné dva kroky zamestnancov sa nezmenia v rámci krokov Kontaktov), ako aj medzi oblasťami, ktoré odkazujú na iné oblasti (napríklad posledné dva kroky zamestnancov), a oblasťami, ktoré sa nezadá (napríklad prvé tri kroky zamestnancov).

Po statickom zoskupovaní oblastí brány firewall.

Teraz vstupuje do dynamickej fázy. V tejto fáze sa vyhodnocujú vyššie uvedené statické oblasti. Oblasti, ktoré nemajú prístup k žiadnemu zdroju údajov, sa oreú. Oblasti sa potom zoskupia, aby sa vytvorili zdrojové oblasti, ktoré sú čo možno najviac veľké. V tomto ukážkový scenári však k všetkým zostávajúcim oblastim pristupujú k zdrojom údajov a žiadne ďalšie zoskupenie nie je možné vykonať. Oblasti v našej vzorke sa preto počas tejto fázy nezmenia.

Poďme predstierať

Len na ilustráciu sa však poďme pozrieť, čo by sa stalo, ak by dotaz Kontakty bol namiesto toho, aby z textového súboru vychádzal ťažko za predvoľbovaný v M (napríklad prostredníctvom dialógového okna Zadať údaje).

V tomto prípade dotaz Contacts nebude mať prístup k žiadnemu zdroju údajov. Preto by sa skrátil počas prvej časti dynamickej fázy.

Oblasť brány firewall po dynamickom orezávaní fázy.

Po odstránení oblasti Kontakty by posledné dva kroky zamestnancov už odkazovať na žiadne oblasti okrem oblasti obsahujúcej prvé tri kroky zamestnancov. Preto by boli tieto dve oblasti zoskupené.

Výsledná oblasť bude vyzerať takto.

Záverečné oblasti brány firewall.

Príklad: Prenos údajov z jedného zdroja údajov do iného

Takže, dostatok abstraktného vysvetlenia. Pozrime sa na bežný scenár, v ktorom pravdepodobne narazíte na chybu brány firewall a na kroky, ako ju vyriešiť.

Predstavte si, že chcete vyhľadať názov spoločnosti zo služby OData pre spoločnosť Northwind a potom použiť názov spoločnosti na vykonanie Bing vyhľadávania.

Najprv vytvorte dotaz Company (Spoločnosť), ktorý načíta názov spoločnosti.

let
    Source = OData.Feed("https://services.odata.org/V4/Northwind/Northwind.svc/", null, [Implementation="2.0"]),
    Customers_table = Source{[Name="Customers",Signature="table"]}[Data],
    CHOPS = Customers_table{[CustomerID="CHOPS"]}[CompanyName]
in
    CHOPS

Potom vytvorte vyhľadávací dotaz, ktorý odkazuje na položku Spoločnosť a odovzdá ho Bing.

let
    Source = Text.FromBinary(Web.Contents("https://www.bing.com/search?q=" & Company))
in
    Source

V tomto momente sa u vás môžu zobraziť problémy. Pri vyhodnocovaní vyhľadávania sa vyprodukuje chyba brány firewall.

Formula.Firewall: Query 'Search' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Je to spôsobené tým, že krok Zdroj vyhľadávania odkazuje na zdroj údajov (bing.com) a tiež odkazuje na iný dotaz/oblasť (Spoločnosť). Porušilo pravidlo uvedené vyššie ("oblasť môže buď pristupovať ku kompatibilným zdrojom údajov, alebo odkazovať na iné oblasti, ale nie na obe").

Čo máte robiť? Jednou z možností je úplne zakázať bránu firewall (prostredníctvom možnosti Ochrana osobných údajov s označením Ignorovať úrovne ochrany osobných údajov a potenciálne zvýšiť výkon ). Čo však v prípade, ak chcete povoliť bránu firewall?

Ak chcete chybu vyriešiť bez vypnutia brány firewall, môžete skombinovať spoločnosť a vyhľadávanie do jedného dotazu, ako je to možné:

let
    Source = OData.Feed("https://services.odata.org/V4/Northwind/Northwind.svc/", null, [Implementation="2.0"]),
    Customers_table = Source{[Name="Customers",Signature="table"]}[Data],
    CHOPS = Customers_table{[CustomerID="CHOPS"]}[CompanyName],
    Search = Text.FromBinary(Web.Contents("https://www.bing.com/search?q=" & CHOPS))
in
    Search

Všetko sa teraz deje v rámci jednej oblasti. Za predpokladu, že úrovne ochrany osobných údajov pre tieto dva zdroje údajov sú kompatibilné, brána firewall by teraz mala byť spokojná a už sa vám nebude zobraziť chyba.

To je obal

Aj keď v tejto téme možno povedať ešte oveľa viac, tento úvodný článok je už dostatočne dlhý. Dúfame, že vám to pomôže lepšie porozumieť bráne firewall a pomôže vám pochopiť a opraviť chyby brány firewall, keď sa na ne v budúcnosti stretnete.