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