Routines autorisées
Les routines autorisées vous permettent de partager des résultats de requête avec des utilisateurs ou des groupes spécifiques, sans leur donner accès aux tables sous-jacentes qui ont généré les résultats. Par exemple, une routine autorisée peut calculer une agrégation sur des données ou rechercher une valeur de table et utiliser cette valeur dans un calcul.
Par défaut, si un utilisateur appelle une routine, il doit être autorisé à lire les données de la table. Vous pouvez également autoriser la routine à accéder à l'ensemble de données contenant la table référencée. Une routine autorisée peut interroger les tables de l'ensemble de données, même si l'utilisateur qui appelle la routine ne peut pas interroger ces tables directement.
Les types de routines suivants peuvent être autorisés:
Autoriser les routines
Pour autoriser une routine, utilisez la console Google Cloud, l'outil de ligne de commande bq ou l'API REST :
Console
Accédez à la page BigQuery de Google Cloud Console.
Dans la section Explorer du panneau de navigation, développez votre projet et sélectionnez un ensemble de données.
Dans le panneau de détails, développez Partage, puis cliquez sur Autoriser les routines.
Sur la page Routines autorisées, dans la section Autoriser la routine, sélectionnez le projet, l'ensemble de données et la routine pour la routine que vous souhaitez autoriser.
Cliquez sur Ajouter une autorisation.
bq
Utilisez la commande
bq show
pour obtenir la représentation JSON de l'ensemble de données auquel la routine doit accéder. Le résultat de la commande est une représentation JSON de la ressourceDataset
. Enregistrez le résultat dans un fichier local.bq show --format=prettyjson TARGET_DATASET > dataset.json
Remplacez TARGET_DATASET par le nom de l'ensemble de données auquel la routine peut accéder.
Modifiez le fichier pour ajouter l'objet JSON suivant au tableau
access
de la ressourceDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Où :
- DATASET_NAME est le nom de l'ensemble de données contenant la routine.
- PROJECT_ID est l'ID du projet contenant la routine.
- ROUTINE_NAME est le nom de la routine.
Exécutez la commande
bq update
pour mettre à jour l'ensemble de données.bq update --source dataset.json TARGET_DATASET
API
Appelez la méthode
datasets.get
pour récupérer l'ensemble de données auquel la routine doit accéder. Le corps de la réponse contient une représentation de la ressourceDataset
.Ajoutez l'objet JSON suivant au tableau
access
de la ressourceDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Où :
- DATASET_NAME correspond au nom de l'ensemble de données contenant la fonction définie par l'utilisateur.
- PROJECT_ID est l'ID du projet contenant la fonction définie par l'utilisateur.
- ROUTINE_NAME est le nom de la routine.
Appelez la méthode
dataset.update
avec la représentationDataset
modifiée.
Quotas et limites
Les routines autorisées sont soumises à des limites en termes d'ensembles de données. Pour en savoir plus, consultez la section Limites des ensembles de données.
Exemple de routine autorisée
Voici un exemple de bout en bout de la création et de l'utilisation d'une fonction définie par l'utilisateur autorisée.
Créez deux ensembles de données nommés
private_dataset
etpublic_dataset
. Pour en savoir plus sur la création d'un ensemble de données, consultez la page Créer un ensemble de données.Exécutez l'instruction suivante pour créer une table nommée
private_table
dansprivate_dataset
:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
Exécutez l'instruction suivante pour créer une fonction définie par l'utilisateur nommée
count_key
danspublic_dataset
. La fonction définie par l'utilisateur inclut une instructionSELECT
surprivate_table
.CREATE OR REPLACE FUNCTION public_dataset.count_key(input_key STRING) RETURNS INT64 AS ((SELECT COUNT(1) FROM private_dataset.private_table t WHERE t.key = input_key));
Attribuez le rôle
bigquery.dataViewer
à un utilisateur sur l'ensemble de donnéespublic_dataset
. Ce rôle inclut l'autorisationbigquery.routines.get
, qui permet à l'utilisateur d'appeler la routine. Pour en savoir plus sur l'attribution de contrôles d'accès à un ensemble de données, consultez la page Contrôler l'accès aux ensembles de données.À ce stade, l'utilisateur est autorisé à appeler la routine
count_key
, mais ne peut pas accéder à la table dansprivate_dataset
. Si l'utilisateur tente d'appeler la routine, il reçoit un message d'erreur semblable à celui-ci :Access Denied: Table myproject:private_dataset.private_table: User does not have permission to query table myproject:private_dataset.private_table.
À l'aide de l'outil de ligne de commande bq, exécutez la commande
show
comme suit :bq show --format=prettyjson private_dataset > dataset.json
Le résultat est enregistré dans un fichier local nommé
dataset.json
.Modifiez
dataset.json
pour ajouter l'objet JSON suivant au tableauaccess
:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Remplacez PROJECT_ID par l'ID du projet
public_dataset
.À l'aide de l'outil de ligne de commande bq, exécutez la commande
update
comme suit :bq update --source dataset.json private_dataset
Pour vérifier que la fonction définie par l'utilisateur a accès à
private_dataset
, l'utilisateur peut exécuter la requête suivante :SELECT public_dataset.count_key('key1');