Поделиться через


Создание динамического представления

В каталоге 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 используют Spark SQL, можно реализовать расширенное маскирование данных с помощью более сложных выражений SQL и регулярных выражений. В следующем примере все пользователи могут анализировать домены электронной почты, но только члены auditors группы могут просматривать весь адрес электронной почты пользователя.

-- The regexp_extract function takes an email address such as
-- [email protected] 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