Создание динамического представления
В каталоге Unity можно использовать динамические представления для настройки детального контроля доступа, включая:
- Безопасность на уровне столбцов или строк.
- Маскирование данных.
В каталоге Unity представлены следующие функции, которые позволяют динамически ограничивать доступ пользователей к строкам, столбцам или записям в представлении:
current_user()
: возвращает адрес электронной почты текущего пользователя.is_account_group_member()
: возвращаетTRUE
, если текущий пользователь является членом определенной группы уровня учетной записи. Рекомендуется для использования в динамических представлениях с данными каталога Unity.is_member()
: возвращаетTRUE
, если текущий пользователь является членом определенной группы уровня рабочей области. Эта функция предоставляется для совместимости с существующим хранилищем метаданных Hive. Старайтесь не использовать ее с представлениями данных каталога Unity, так как она не оценивает членство в группе на уровне учетной записи.
Azure Databricks рекомендует не предоставлять пользователям возможность читать таблицы и представления, на которые ссылается представление.
В следующих примерах показано, как создавать динамические представления в каталоге Unity.
Подготовка к работе
Для создания или чтения динамических представлений требования совпадают с требованиями к стандартным представлениям, за исключением требований к вычислению. Необходимо использовать один из следующих вычислительных ресурсов:
Хранилище SQL.
Вычисление с общим режимом доступа.
Вычисление с одним режимом доступа пользователей в Databricks Runtime 15.4 LTS или более поздней версии.
Динамические представления нельзя читать с помощью вычислений одного пользователя в Databricks Runtime 15.3 или ниже.
Чтобы воспользоваться преимуществами фильтрации данных, предоставляемых в Databricks Runtime 15.4 LTS и более поздних версиях, необходимо также убедиться, что рабочая область включена для бессерверных вычислений, так как функции фильтрации данных, поддерживающие динамические представления, выполняются на бессерверных вычислениях. Поэтому вы можете взимать плату за бессерверные вычислительные ресурсы при использовании одного пользователя для чтения динамических представлений. Подробные инструкции по управлению доступом для отдельных пользователей.
Разрешения на уровне столбцов
С помощью динамического представления можно ограничить столбцы, к которым имеет доступ конкретный пользователь или группа. В следующем примере только у членов группы auditors
есть доступ к адресам электронной почты из таблицы sales_raw
. Во время анализа запросов Apache Spark заменяет инструкцию CASE
строкой литерала REDACTED
или фактическим содержимым столбца адресов электронной почты. Другие столбцы возвращаются как обычно. Эта стратегия не оказывает негативного влияния на производительность запросов.
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
Разрешения уровня строк
С помощью динамического представления можно указать разрешения на уровне строк или полей. В следующем примере только члены группы managers
могут просматривать суммы транзакций, превышающих 1 000 000 долл. США. Для других пользователей соответствующие результаты будут отфильтрованы.
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
Маскирование данных
Поскольку представления в каталоге Unity используют SQL Spark, можно реализовать расширенное маскирование данных с помощью более сложных выражений SQL и регулярных выражений. В следующем примере все пользователи могут анализировать домены электронной почты, но только члены группы auditors
могут видеть полный адрес электронной почты пользователя.
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw