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 accorder d'accès direct aux tables sous-jacentes. Par exemple, une routine peut calculer des agrégations ou rechercher une valeur de table et utiliser cette valeur dans un calcul.
Par défaut, pour exécuter une routine, les utilisateurs doivent disposer d'un accès en lecture aux données référencées. Vous pouvez également autoriser la routine à accéder directement à l'ensemble de données conteneur, ce qui permet aux utilisateurs d'exécuter la routine sans autorisations au niveau de la table. Vous pouvez autoriser les fonctions de table, les fonctions définies par l'utilisateur (UDF) et les procédures stockées.
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 la console Google Cloud .
Dans le volet de gauche, cliquez sur Explorateur :

Si le volet de gauche ne s'affiche pas, cliquez sur Développer le volet de gauche pour l'ouvrir.
Dans le volet Explorateur, développez votre projet, cliquez sur Ensembles de données, puis sélectionnez un ensemble de données.
Dans le volet Détails, cliquez sur Partager > 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
Exécutez la commande
bq showpour 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_DATASETpar 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
accessde la ressourceDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Remplacez les éléments suivants :
DATASET_NAME: nom de l'ensemble de données contenant la routine.PROJECT_ID: ID du projet contenant la routine.ROUTINE_NAME: Nom de la routine.
Facultatif : Si vous autorisez une procédure stockée, associez un rôle IAM. Ce rôle limite l'accès à la procédure autorisée en fonction de ses autorisations. Pour ce faire, ajoutez
"role"à l'objet JSON :{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Remplacez
ROLE_NAMEpar le nom du rôle que vous souhaitez associer. Vous pouvez associer les rôles suivants à une procédure stockée :- Lecteur de métadonnées de routine BigQuery (
roles/bigquery.routineMetadataViewer) - Lecteur de données de routine BigQuery (
roles/bigquery.routineDataViewer) - Éditeur de données de routine BigQuery (
roles/bigquery.routineDataEditor) - Administrateur de routines BigQuery (
roles/bigquery.routineAdmin)
- Lecteur de métadonnées de routine BigQuery (
Exécutez la commande
bq updatepour mettre à jour l'ensemble de données :bq update --source dataset.json TARGET_DATASET
API
Appelez la méthode
datasets.getpour 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
accessde la ressourceDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Remplacez les éléments suivants :
DATASET_NAME: nom de l'ensemble de données contenant la UDF;utilisateur.PROJECT_ID: ID du projet contenant la UDF;utilisateur.ROUTINE_NAME: Nom de la routine.
Facultatif : si vous autorisez une procédure stockée, associez un rôle IAM. Ce rôle limite l'accès à la procédure autorisée en fonction de ses autorisations. Pour ce faire, ajoutez
"role"à l'objet JSON :{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Remplacez
ROLE_NAMEpar le nom du rôle que vous souhaitez associer. Vous pouvez associer les rôles suivants à une procédure stockée :- Lecteur de métadonnées de routine BigQuery (
roles/bigquery.routineMetadataViewer) - Lecteur de données de routine BigQuery (
roles/bigquery.routineDataViewer) - Éditeur de données de routine BigQuery (
roles/bigquery.routineDataEditor) - Administrateur de routines BigQuery (
roles/bigquery.routineAdmin)
- Lecteur de métadonnées de routine BigQuery (
Appelez la méthode
dataset.updateavec la représentationDatasetmodifié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.
Si vous mettez à jour une routine, l'autorisation de ses routines autorisées existantes expire. BigQuery supprime automatiquement les entrées d'autorisation des routines autorisées obsolètes dans un délai de 24 heures. Pour mettre à jour les entrées immédiatement, vous devez supprimer manuellement l'entrée de la liste "Routines actuellement autorisées" avant de l'autoriser à nouveau.
Limites
Vous ne pouvez pas créer de routine autorisée dans une instance répliquée secondaire. Pour en savoir plus, consultez Comportement des ressources dans la réplication d'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_datasetetpublic_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_tabledansprivate_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_keydanspublic_dataset. La fonction définie par l'utilisateur inclut une instructionSELECTsurprivate_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 Utiliser les contrôles d'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
showcomme suit :bq show --format=prettyjson private_dataset > dataset.json
Le résultat est enregistré dans un fichier local nommé
dataset.json.Modifiez
dataset.jsonpour ajouter l'objet JSON suivant au tableauaccess:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Remplacez
PROJECT_IDpar l'ID du projetpublic_dataset.À l'aide de l'outil de ligne de commande bq, exécutez la commande
updatecomme 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');