Параметры конфиденциальности
данных в Power BI/Power Query, часть 2: Воспрепятствование выполнения запроса
Текст представляет собой адаптированный перевод статьи Chris Webb (Крис Уэбб),
оригинал – Data Privacy Settings In Power BI/Power Query, Part 2: Preventing Query Execution.
Крис Вебб (Chris Webb) — независимый эксперт, консультант по технологиям Analysis Services, MDX, Power Pivot, DAX, Power Query и Power BI. Его блог — это кладезь информации на тему перечисленных технологий. Вот уже более 10 лет он пишет про BI-решения от Microsoft. Количество его статей перевалило за 1000! Также Крис выступает на большом количестве различных конференций вроде SQLBits, PASS Summit, PASS BA Conference, SQL Saturdays и участвует в различных сообществах.
Крис любезно разрешил нам переводить его статьи на русский язык. И это одна из них.

Параметры конфиденциальности данных в Power BI/Power Query, часть 2: воспрепятствование выполнения запроса

В первой части данной серии статей было рассмотрено, как параметры конфиденциальности данных влияют на производительность запросов в Excel Power Query/Get & Transform и Power BI. В этой статье мы покажем, как вышеупомянутые параметры могут вообще остановить выполнение запроса.

Воспользуемся книгой Excel из первой части. Но на этот раз мы не будем использовать наименование дня недели для фильтрации данных, а отправим это значение на веб-сервис. Данный сервис осуществляет поиск по открытым данным, опубликованными правительством Великобритании. Он расположен по адресу https://data.gov.uk. Всё очень просто: задаём поисковый ключ и получаем документ формата JSON с результатом поиска. Не требуется никакой авторизации или других проверок. Например:

https://data.gov.uk/api/3/action/package_search?q=Friday

На самом деле неважно, что делает сервис. Достаточно знать, что мы отправляем параметр – текст, и получаем результат.

Вот код запроса, который считывает блок текста из таблицы FilterDay нашей книги:
…и передаёт значение на веб сервис:
let
    ExcelSource = 
    Excel.Workbook(
        File.Contents("C:\FilterParameter.xlsx")
    , null, true),
    FilterDay_Table = 
    ExcelSource{[Item="FilterDay",Kind="Table"]}[Data],
    ChangedType = 
    Table.TransformColumnTypes(
        FilterDay_Table,
        {{"Parameter", type text}}
        ),
    Day = ChangedType{0}[#"Parameter"],
    Output = 
    Web.Contents(
        "https://data.gov.uk/api/3/action/package_search", 
        [Query=[q=Day]]
    ),
    ImportedJSON = Json.Document(Output,65001)
in
    ImportedJSON
Данный запрос выполнится при соблюдении одного из трех вариантов:

  • Уровень конфиденциальности книги Excel и веб-сервиса установлен Public
  • Уровень конфиденциальности книги Excel и веб-сервиса установлен Organizational
  • Уровень конфиденциальности книги Excel установлен None. а у веб сервиса Public
[Как настроить уровни смотрите на официальном сайте Майкрософт. Интересно, что уровень для веб-сервиса нельзя установить None. Перед выполнением запроса всегда появляется диалог с предложением установить уровень.]

Результат успешного выполнения запроса:
Любая другая комбинация параметров конфиденциальности, например, книга и сервис получат уровень Private, вызовет ошибку и появление предупреждения о том, что имеющиеся уровни нельзя использовать вместе.
Можно отправлять данные от источника Public к другому такому же, или от источника Organizational к другому с уровнем Organizational. Но нельзя отправить данные от источника Private к любому другому, или от источника Public к источнику Private.

В предыдущей статье мы рассмотрели случай, когда движок не мог отправить данные другому источнику из-за правил конфиденциальности. Тем не менее запрос выполнялся, хотя и менее эффективным способом. В этом примере нет возможности выполнить запрос к веб-сервису, не отправив данные из книги. В результате, если установлены несовместимые уровни, запрос вызовет ошибку.

Обратите внимание, что в рассмотренном запросе осуществляется чтение данных из книги и отсылка их на сервис. Используется один запрос. Так сделано преднамеренно. В следующей статье мы рассмотрим пример, когда движок не сможет выполнить запрос, хотя уровни конфиденциальности позволяют это.
Другие статьи цикла:
- часть 1
- часть 2
- часть 3
- часть 4
- часть 5