Создание динамического представления
В Unity Catalogможно использовать динамические views для настройки точного контроля доступа, включая:
- Безопасность на уровне columns или строк.
- Маскирование данных.
В Catalog Unity представлены следующие функции, которые позволяют динамически limit доступ пользователей к строке, columnили записи в представлении:
-
current_user()
: возвращает адрес электронной почты текущего пользователя. -
is_account_group_member()
: возвращаетTRUE
, если текущий пользователь является членом определенной группы уровня учетной записи. Рекомендуется для использования в динамических данных views против данных Unity Catalog. -
is_member()
: возвращаетTRUE
, если текущий пользователь является членом определенной группы уровня рабочей области. Эта функция предоставляется для совместимости с существующим хранилищем метаданных Hive. Не используйте его с views для данных Unity Catalog, так как он не оценивает членство в группе на уровне учетной записи.
Azure Databricks рекомендует не grant пользователям возможность читать tables и views, на которые ссылается представление.
В следующих примерах показано, как создать динамические views в Unity Catalog.
Подготовка к работе
Для создания или чтения динамических viewsтребования те же, что и для стандартных views, за исключением требований к вычислению. Необходимо использовать один из следующих вычислительных ресурсов:
Хранилище SQL.
Вычисление с общим режимом доступа.
Вычисление с одним режимом доступа пользователей в Databricks Runtime 15.4 LTS или более поздней версии.
Вы не можете считывать динамические данные views, используя вычислительные мощности одного пользователя в Databricks Runtime 15.3 или ниже.
Чтобы воспользоваться преимуществами фильтрации данных, предоставляемых в Databricks Runtime 15.4 LTS и более поздних версиях, необходимо также убедиться, что рабочей области включена для бессерверных вычислительных, так как функции фильтрации данных, поддерживающие динамические views выполняются на бессерверных вычислениях. Таким образом, может взиматься плата за бессерверные вычислительные ресурсы, когда вы используете одно-пользовательские вычисления для обработки динамических views. Подробные инструкции по управлению доступом для отдельных пользователей.
Columnуровня разрешения
С помощью динамического представления вы можете limit, к чему именно пользователь или группа columns могут получить доступ. В следующем примере только члены группы auditors
могут получить доступ к адресам электронной почты из sales_raw
table. Во время анализа запросов Apache Spark заменяет выражение CASE
литеральной строкой REDACTED
или фактическим содержимым адреса электронной почты column. Другие columns возвращаются как обычным образом. Эта стратегия не оказывает негативного влияния на производительность запросов.
-- 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;
Маскирование данных
Поскольку views в Unity Catalog используется Spark SQL, можно реализовать расширенное маскирование данных с помощью более сложных выражений 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