Ce document explique comment créer des vues autorisées dans BigQuery.
Vous pouvez créer une vue autorisée dans BigQuery selon les méthodes suivantes :
- Utiliser Cloud Console
- En exécutant la commande
bq mk
de l'outil de ligne de commandebq
- En appelant la méthode API
tables.insert
- Utiliser les bibliothèques clientes
Présentation
En créant une vue autorisée dans BigQuery, vous permettez à cette vue d'accéder à un ensemble de données. Une vue autorisée vous permet de partager des résultats de requête avec des utilisateurs et des groupes particuliers sans leur donner accès aux données sources sous-jacentes. Vous pouvez également utiliser la requête SQL de la vue pour limiter les colonnes (champs) que les utilisateurs peuvent interroger.
Lorsque vous créez une vue autorisée dans un autre ensemble de données, l'ensemble de données source et celui de la vue autorisée doivent se trouver dans le même emplacement régional.
Pour consulter un tutoriel sur la création d'une vue autorisée, consultez la page Créer une vue autorisée.
Autorisations requises
Pour créer ou mettre à jour une vue autorisée, vous devez disposer d'autorisations sur l'ensemble de données qui contient la vue et sur celui qui lui donne accès.
Ensemble de données contenant la vue
Les vues sont traitées comme des ressources de table dans BigQuery. Par conséquent, la création d'une vue nécessite les mêmes autorisations que la création d'une table. Pour créer une vue, vous devez au minimum disposer des autorisations bigquery.tables.create
. Les rôles IAM prédéfinis suivants incluent les autorisations bigquery.tables.create
:
bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
En outre, si un utilisateur possède les autorisations bigquery.datasets.create
, il obtient également un accès bigquery.dataOwner
à l'ensemble de données qu'il crée.
L'accès bigquery.dataOwner
permet à l'utilisateur de créer des vues dans l'ensemble de données.
Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.
Ensemble de données donnant accès à la vue
Pour mettre à jour les propriétés d'un ensemble de données, vous devez au minimum disposer des autorisations bigquery.datasets.update
et bigquery.datasets.get
. Les rôles IAM prédéfinis suivants incluent les autorisations bigquery.datasets.update
et bigquery.datasets.get
:
bigquery.dataOwner
bigquery.admin
En outre, si un utilisateur possède les autorisations bigquery.datasets.create
, il obtient également un accès bigquery.dataOwner
à l'ensemble de données qu'il crée.
L'accès bigquery.dataOwner
permet à l'utilisateur de mettre à jour les propriétés des ensembles de données qu'il crée.
Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Contrôle des accès.
Accorder aux vues l'accès aux ensembles de données
Pour accorder à une vue l'accès à un ensemble de données :
Console
Dans le panneau Explorateur, développez votre projet et sélectionnez un ensemble de données.
Dans le panneau de détails, cliquez sur Partager l'ensemble de données.
Dans le panneau Autorisations d'ensemble de données, sélectionnez l'onglet Vues autorisées.
Dans la section Partager la vue autorisée :
- Dans le champ Sélectionner un projet, vérifiez le nom du projet. Si la vue se trouve dans un autre projet, veillez à le sélectionner.
- Dans le champ Sélectionner un ensemble de données, choisissez l'ensemble de données contenant la vue.
- Dans le champ Sélectionner une vue, sélectionnez la vue que vous autorisez.
Cliquez sur Ajouter, puis sur OK.
bq
Écrivez les informations sur l'ensemble de données existant (y compris les contrôles d'accès) dans un fichier JSON à l'aide de la commande
show
. Si l'ensemble de données se trouve dans un projet autre que celui par défaut, ajoutez l'ID de ce projet au nom de l'ensemble de données, en respectant le format suivant :project_id:dataset
.bq show \ --format=prettyjson \ project_id:dataset > path_to_file
Où :
- project_id est l'ID de votre projet ;
- dataset est le nom de votre ensemble de données ;
- path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.
Exemples :
Saisissez la commande suivante pour écrire les contrôles d'accès pour
mydataset
dans un fichier JSON.mydataset
se trouve dans votre projet par défaut.bq show --format=prettyjson mydataset > /tmp/mydataset.json
Saisissez la commande suivante pour écrire les contrôles d'accès pour
mydataset
dans un fichier JSON.mydataset
se trouve dansmyotherproject
.bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
Ajoutez la vue autorisée à la section "access" du fichier JSON.
Par exemple, la section d'accès du fichier JSON d'un ensemble de données ressemblerait à ceci :
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" } { "role": "READER", "specialGroup": "allAuthenticatedUsers" } { "role": "READER", "domain": "[DOMAIN_NAME]" } { "role": "WRITER", "userByEmail": "[USER_EMAIL]" } { "role": "READER", "groupByEmail": "[GROUP_EMAIL]" }, { "view":{ "datasetId": "[DATASET_NAME]", "projectId": "[PROJECT_NAME]", "tableId": "[VIEW_NAME]" } } ], }
Une fois vos modifications terminées, exécutez la commande
update
et incluez le fichier JSON à l'aide de l'option--source
. Si l'ensemble de données se trouve dans un projet autre que celui par défaut, ajoutez l'ID de ce projet au nom de l'ensemble de données, en respectant le format suivant :project_id:dataset
.bq update \ --source path_to_file \ project_id:dataset
Où :
- path_to_file est le chemin d'accès au fichier JSON sur votre ordinateur local.
- project_id est l'ID de votre projet.
- dataset est le nom de votre ensemble de données.
Exemples :
Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour
mydataset
.mydataset
se trouve dans votre projet par défaut.bq update --source /tmp/mydataset.json mydataset
Saisissez la commande suivante pour mettre à jour les contrôles d'accès pour
mydataset
.mydataset
se trouve dansmyotherproject
.bq update --source /tmp/mydataset.json myotherproject:mydataset
Pour vérifier les modifications apportées aux contrôles d'accès, saisissez à nouveau la commande
show
sans écrire les informations dans un fichier.bq show --format=prettyjson [DATASET]
ou
bq show --format=prettyjson [PROJECT_ID]:[DATASET]
API
Appelez la méthode datasets.patch
et utilisez la propriété access
pour mettre à jour vos contrôles d'accès. Pour en savoir plus, consultez la page Ensembles de données.
Comme la méthode datasets.update
remplace l'intégralité de la ressource d'ensemble de données, il est préférable d'utiliser la méthode datasets.patch
pour mettre à jour les contrôles d'accès.
Go
Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.
Java
Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Java.
Python
Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Python.
Appliquer un accès de niveau ligne à l'aide d'une vue
Les vues peuvent permettre de restreindre l'accès à des colonnes (champs) spécifiques. Si vous souhaitez restreindre l'accès à des lignes individuelles de votre table, vous n'avez pas besoin de créer des vues distinctes pour chaque utilisateur ou groupe. Au lieu de cela, vous pouvez utiliser la fonction SESSION_USER()
pour renvoyer l'adresse e-mail de l'utilisateur actuel.
Pour afficher différentes lignes pour différents utilisateurs, ajoutez à votre table un champ contenant l'utilisateur autorisé à voir la ligne. Ensuite, créez une vue qui utilise la fonction SESSION_USER()
. Dans l'exemple suivant, les noms d'utilisateur sont stockés dans le champ allowed_viewer
:
SELECT COLUMN_1, COLUMN_2 FROM `dataset.view` WHERE allowed_viewer = SESSION_USER()
La limite de cette approche est que vous ne pouvez accorder l'accès qu'à un seul utilisateur à la fois. Vous pouvez contourner cette limite en faisant de allowed_viewer
un champ répété. Cette approche permet de fournir une liste d'utilisateurs pour chaque ligne, mais même si vous utilisez un champ répété, le stockage des noms d'utilisateur dans la table nécessite toujours de suivre manuellement chaque utilisateur ayant accès à chaque ligne.
À la place, indiquez des noms de groupe dans le champ allowed_viewer
, puis créez une table distincte mappant les groupes avec les utilisateurs. La table qui mappe les groupes avec les utilisateurs possède un schéma qui stocke les noms de groupe et les noms d'utilisateur. Exemple : {group:string, user_name:string}
. Cette approche vous permet de gérer les informations sur les utilisateurs et les groupes séparément de la table contenant les données.
Si la table de mappage est nommée private.access_control
, la requête SQL utilisée pour créer la vue autorisée est :
SELECT c.customer, c.id FROM `private.customers` c INNER JOIN ( SELECT group FROM `private.access_control` WHERE SESSION_USER() = user_name) g ON c.allowed_group = g.group
Étapes suivantes
- Pour consulter un tutoriel sur la création d'une vue autorisée, consultez la page Créer une vue autorisée.
- Pour en savoir plus sur la création de vues, consultez la page Créer des vues.
- Pour savoir comment répertorier les vues, consultez la page Répertorier des vues.
- Pour en savoir plus sur l'obtention de métadonnées de vue, consultez la page Obtenir des informations sur les vues.
- Pour en savoir plus sur la mise à jour de vues, consultez la page Mettre à jour les vues.
- Pour en savoir plus sur la gestion des vues, consultez la page Gérer les vues.