Параметры конфиденциальности данных в Power BI/Power Query, часть 5: наследование параметров конфиденциальности данных и уровень None
Текст представляет собой адаптированный перевод статьи Chris Webb (Крис Уэбб),
оригинал — Data Privacy Settings In Power BI/Power Query, Part 5:
The Inheritance Of Data Privacy Settings And The None Data Privacy Level
Крис Вебб (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, часть 5: наследование параметров конфиденциальности данных и уровень None

Когда автор брался за написание данной серии статей ( часть 1, часть 2, часть 3, часть 4), одна вещь оставалась не вполне понятой. А именно: как работает уровень None параметра конфиденциальности данных. Однако Курт Хагенлочер (Curt Hagenlocher), представитель команды разработчиков, любезно дал объяснение по этому вопросу. Чуть ниже мы покажем, как влияет этот параметр на обработку данных, и как уровень конфиденциальности может наследоваться от других источников данных.

Давайте вернемся к исходному примеру, использованному в части 1. В нем показывалось, как данные книги Excel могут объединяться с данными SQL сервера, и как уровень конфиденциальности данных определяет произойдет ли складывание запроса или нет. Теперь предположим, что книга находится в папке C:\Data Privacy Demo, и запрос FilterDay получает данные из неё:
let
    Source = 
    Excel.Workbook(
        File.Contents(
        "C:\Data Privacy Demo\FilterParameter.xlsx"
        )
    , null, true),
    FilterDay_Table = 
    Source{[Item="FilterDay",Kind="Table"]}[Data],
    ChangedType = 
    Table.TransformColumnTypes(
        FilterDay_Table,
        {{"Parameter", type text}}
    ),
    Output = 
    ChangedType{0}[#"Parameter"]
in
    Output
Этот запрос получает название дня недели из таблицы книги. В нашем случае это Friday (пятница):
Этот запрос ссылается на другой для фильтрации данных в таблице базы данных SQL:
let
    Source = Sql.Databases("localhost"),
    DB = Source{[Name="Adventure Works DW"]}[Data],
    dbo_DimDate = DB{[Schema="dbo",Item="DimDate"]}[Data],
    RemovedColumns = Table.SelectColumns(dbo_DimDate,
        {"DateKey", "EnglishDayNameOfWeek"}),
    FilteredRows = Table.SelectRows(RemovedColumns, 
        each ([EnglishDayNameOfWeek] = FilterDay))
in
    FilteredRows
…после первого запуска будет предложено ввести учетные данные для доступа к SQL серверу и установить уровни конфиденциальности для источников данных:
Выпадающие списки справа позволяют задать параметры конфиденциальности для каждого источника данных. Теперь посмотрим внимательнее на источник данных в левой колонке. Стоит отметить два момента:

Источники данных для запроса — это таблица DimDate в базе данных Adventure Works DW локалхоста и файл C:\Data Privacy Demo\FilterParameter.xlsx. Однако установить уровень конфиденциальности предлагается для локалхоста и диска c:.

Можно выбрать другие источники из выпадающих списков.
Щёлкнем по выпадающим спискам:
Для базы данных сервера SQL предлагается два варианта: локалхост (по умолчанию) или база данных Adventure Works DW.
Для книги Excel предлагается три варианта: диск c:\ (по умолчанию), папка c:\Data Privacy Demo, в которой лежит книга, и сама книга.

Оставим слева параметры по умолчанию, а уровень каждому источнику установим Public:
Как и ожидается после прочтения части 1, запрос выполняется и выполняется складывание:
Теперь скопируем файл Excel в корень диска c:\ и переименуем его: filterparameter2.xlsx. Затем изменим запрос FilterDay, чтобы получать данные из нового файла:
let
    Source = 
    Excel.Workbook(
        File.Contents(
        "C:\FilterParameter2.xlsx"
        )
    , null, true),
    FilterDay_Table = 
    Source{[Item="FilterDay",Kind="Table"]}[Data],
    ChangedType = 
    Table.TransformColumnTypes(
        FilterDay_Table,
        {{"Parameter", type text}}
    ),
    Output = 
    ChangedType{0}[#"Parameter"]
in
    Output
После этого, если мы щёлкнем по кнопке Data Source Settings, а потом выберем Edit Permissions для файла c:\filterparameter2.xlsx, то увидим уровень конфиденциальности, установленный в None:
Однако запрос обрабатывает этот источник, как имеющий уровень Public: второй запрос к серверу SQL выполняется, складывание происходит и отсутствует предложение установить уровень конфиденциальности. Почему?

Параметр None означает, что конкретно для этого источника уровень не установлен. Однако в этом случае модуль проверяет установлен ли уровень для папки файла и для всех папок до корня диска. В нашем случае, после назначения диску уровня Public, все файлы во всех папках диска, имеющие уровень конфиденциальности None наследуют его:
То же самое относится к базам данных сервера SQL. Они могут наследовать установки конфиденциальности. Для веб-сервисов это также верно, только разбивка происходит по различным частям URL. Вот, например, список для веб-сервиса https://data.gov.uk/api/3/action/package_search, упомянутого в части 2:
Основное правило состоит в том, что движок сначала ищет разрешения для конкретного источника данных, и если не находит, продолжает поиск в более общих правилах.

На наш взгляд, механизм использования параметра None вместе с наследованием совсем неочевиден. Из интерфейса невозможно понять, как происходит наследование. К счастью, команда разработчиков собирается сделать этот момент более прозрачным. Пожелания состоят в том, чтобы была возможность увидеть сам факт наследования уровня конфиденциальности, а также от какого объекта это происходит непосредственно в диалоге Edit Permissions.
Другие статьи цикла:
- часть 1
- часть 2
- часть 3
- часть 4
- часть 5