Criar uma exibição dinâmica
No Catálogo do Unity, você pode usar exibições dinâmicas para configurar o controle de acesso refinado, incluindo:
- Segurança de nível de colunas ou linhas.
- Mascaramento de dados.
O Catálogo do Unity apresenta as seguintes funções, que permitem limitar dinamicamente quais usuários podem acessar uma linha, coluna ou um registro em uma exibição:
current_user()
: retorna o endereço de email do usuário atual.is_account_group_member()
: retornaTRUE
se o usuário atual é membro de um grupo específico de nível de conta. Recomendado para uso em exibições dinâmicas nos dados do Catálogo do Unity.is_member()
: retornaTRUE
se o usuário atual é membro de um grupo específico de nível de workspace. Essa função é fornecida para compatibilidade com o metastore do Hive existente. Evite usá-la com exibições nos dados do Catálogo do Unity, pois ela não avalia a associação ao grupo de nível de conta.
O Azure Databricks recomenda que você não conceda aos usuários a capacidade de ler as tabelas e as exibições referenciadas na exibição.
Os exemplos a seguir ilustram como criar exibições dinâmicas no Catálogo do Unity.
Antes de começar
Para criar ou ler exibições dinâmicas, os requisitos são os mesmos para exibições padrão, exceto os requisitos de computação. Você precisa usar um dos seguintes recursos de computação:
Um SQL warehouse.
Computação com modo de acesso compartilhado.
Compute com o modo de acesso de usuário único no Databricks Runtime 15.4 LTS ou superior.
Você não pode ler exibições dinâmicas usando a computação de usuário único no Databricks Runtime 15.3 ou inferior.
Para aproveitar a filtragem de dados fornecida no Databricks Runtime 15.4 LTS e superior, você também precisa verificar se o seu workspace está habilitado para computação sem servidor, porque a funcionalidade de filtragem de dados que dá suporte a filtros de exibições dinâmicas é executada na computação sem servidor. Portanto, você pode ser cobrado por recursos de computação sem servidor ao usar a computação de usuário único para ler exibições dinâmicas. Consulte Controle de acesso refinado na computação de usuário único.
Permissões de nível de compartilhamento
Com uma exibição dinâmica, você pode limitar as colunas que um usuário ou um grupo específico pode acessar. No exemplo a seguir, somente os membros do grupo auditors
podem acessar os endereços de email da tabela sales_raw
. Durante a análise de consulta, o Apache Spark substitui a instrução CASE
pela cadeia de caracteres literal REDACTED
ou pelo conteúdo real da coluna de endereços de email. Outras colunas são retornadas normalmente. Essa estratégia não tem impacto negativo sobre o desempenho da consulta.
-- 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
Permissões de nível de linha
Com uma exibição dinâmica, você pode especificar permissões até o nível de linha ou de campo. No exemplo a seguir, somente os membros do grupo managers
podem ver os valores de transações quando excederem US$ 1.000.000. Os resultados correspondentes são excluídos para outros usuários.
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;
Mascaramento de dados
Como as exibições no Catálogo do Unity usam o Spark SQL, você pode implementar o mascaramento de dados avançado usando expressões SQL mais complexas e expressões regulares. No exemplo a seguir, todos os usuários podem analisar domínios de email, mas somente os membros do grupo auditors
podem ver o endereço de email completo de um usuário.
-- 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