Créer une vue dynamique
Dans Unity Catalog, vous pouvez utiliser des vues dynamiques pour configurer un contrôle d’accès affiné, notamment :
- Sécurité au niveau des colonnes ou des lignes
- Masquage des données
Unity Catalog introduit les fonctions suivantes, qui vous permettent de limiter de manière dynamique les utilisateurs qui peuvent accéder à une ligne, une colonne ou un enregistrement dans une vue :
current_user()
: renvoie l’adresse e-mail de l’utilisateur actuel.is_account_group_member()
: renvoieTRUE
si l’utilisateur actuel est membre d’un groupe de niveau compte spécifique. Recommandé pour une utilisation dans les vues dynamiques par rapport aux données Unity Catalog.is_member()
: renvoieTRUE
si l’utilisateur actuel est membre d’un groupe spécifique au niveau de l’espace de travail. Cette fonction est fournie à des fins de compatibilité avec le metastore Hive existant. Évitez de l’utiliser avec des vues sur des données Unity Catalog, car elle n’évalue pas l’appartenance au groupe de niveau compte.
Azure Databricks recommande de ne pas accorder aux utilisateurs la possibilité de lire les tables et les vues référencées dans la vue.
Les exemples suivants illustrent la création de vues dynamiques dans Unity Catalog.
Avant de commencer
Pour créer ou lire des vues dynamiques, les exigences sont identiques à celles des vues standard, à l’exception des exigences de calcul. Vous devez utiliser l’une des ressources de calcul suivantes :
Un entrepôt SQL.
Calcul avec mode d'accès partagé.
Calcul avec mode d’accès utilisateur unique sur Databricks Runtime 15.4 LTS ou version ultérieure.
Vous ne pouvez pas lire les vues dynamiques à l’aide du calcul mono-utilisateur sur Databricks Runtime 15.3 ou inférieur.
Pour tirer parti du filtrage des données fourni dans Databricks Runtime 15.4 LTS et les versions ultérieures, vous devez également vérifier que votre espace de travail permet le calcul serverless, car la fonctionnalité de filtrage des données qui prend en charge les vues dynamiques s’exécute sur le calcul serverless. Vous pouvez donc être facturé pour les ressources de calcul serverless lorsque vous utilisez le calcul d’un seul utilisateur pour lire des vues dynamiques. Consultez le contrôle d’accès affiné sur le calcul d’un seul utilisateur.
Autorisations au niveau de la colonne
Avec une vue dynamique, vous pouvez limiter les colonnes auxquelles un utilisateur ou un groupe spécifique peut accéder. Dans l’exemple suivant, seuls les membres du groupe auditors
peuvent accéder aux adresses e-mail à partir de la table sales_raw
. Au cours de l’analyse des requêtes, Apache Spark remplace l’instruction CASE
par la chaîne littérale REDACTED
ou le contenu réel de la colonne d’adresses e-mail. Les autres colonnes sont renvoyées normalement. Cette stratégie n’a pas d’impact négatif sur les performances des requêtes.
-- 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
Autorisations au niveau des lignes
Avec une vue dynamique, vous pouvez spécifier des autorisations jusqu’au niveau de la ligne ou du champ. Dans l’exemple suivant, seuls les membres du groupe managers
peuvent afficher les montants des transactions lorsqu’ils dépassent 1 million de dollars. Les résultats correspondants sont filtrés et non visibles par les autres utilisateurs.
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;
Masquage de données
Étant donné que les vues dans Unity Catalog utilisent Spark SQL, vous pouvez implémenter le masquage des données avancé à l’aide d’expressions SQL et d’expressions régulières plus complexes. Dans l’exemple suivant, tous les utilisateurs peuvent analyser des domaines de courrier, mais seuls les membres du groupe auditors
peuvent afficher l’adresse e-mail entière d’un utilisateur.
-- 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