Routine autorizzate
Le routine autorizzate ti consentono di condividere i risultati delle query con utenti o gruppi specifici senza concedere loro l'accesso alle tabelle sottostanti che hanno generato i risultati. Ad esempio, una routine autorizzata può calcolare un'aggregazione sui dati o cercare un valore di tabella e utilizzarlo in un calcolo.
Per impostazione predefinita, se un utente richiama una routine, deve avere accesso in lettura ai dati nella tabella. In alternativa, puoi autorizzare la routine ad accedere al set di dati che contiene la tabella a cui viene fatto riferimento. Una routine autorizzata può eseguire query sulle tabelle nel set di dati, anche se l'utente che chiama la routine non può eseguire query direttamente su queste tabelle.
È possibile autorizzare i seguenti tipi di routine:
Autorizzare le routine
Per autorizzare una routine, utilizza la console Google Cloud , lo strumento a riga di comando bq o l'API REST:
Console
Vai alla pagina BigQuery nella console Google Cloud .
Nel riquadro a sinistra, fai clic su Explorer:

Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro a sinistra per aprirlo.
Nel riquadro Explorer, espandi il progetto, fai clic su Set di dati e poi seleziona un set di dati.
Nel riquadro dei dettagli, fai clic su Condividi > Autorizza routine.
Nella pagina Routine autorizzate, nella sezione Autorizza routine, seleziona Progetto, Set di dati e Routine per la routine che vuoi autorizzare.
Fai clic su Aggiungi autorizzazione.
bq
Utilizza il comando
bq showper ottenere la rappresentazione JSON del set di dati a cui vuoi che la routine acceda. L'output del comando è una rappresentazione JSON della risorsaDataset. Salva il risultato in un file locale.bq show --format=prettyjson TARGET_DATASET > dataset.json
Sostituisci
TARGET_DATASETcon il nome del set di dati a cui la routine può accedere.Modifica il file per aggiungere il seguente oggetto JSON all'array
accessnella risorsaDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Sostituisci quanto segue:
DATASET_NAME: il nome del set di dati che contiene la routine.PROJECT_ID: l'ID progetto del progetto che contiene la routine.ROUTINE_NAME: il nome della routine.
(Facoltativo) Se stai autorizzando una stored procedure, allega un ruolo IAM. Questo ruolo limita l'accesso alla procedura autorizzata in base alle relative autorizzazioni. Per farlo, aggiungi
"role"all'oggetto JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Sostituisci
ROLE_NAMEcon il nome del ruolo che vuoi collegare. Puoi collegare i seguenti ruoli a una stored procedure:- Visualizzatore dei metadati delle routine BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizzatore dati routine BigQuery (
roles/bigquery.routineDataViewer) - Editor dati routine BigQuery (
roles/bigquery.routineDataEditor) - Amministratore routine BigQuery (
roles/bigquery.routineAdmin)
- Visualizzatore dei metadati delle routine BigQuery (
Utilizza il comando
bq updateper aggiornare il set di dati:bq update --source dataset.json TARGET_DATASET
API
Chiama il metodo
datasets.getper recuperare il set di dati a cui vuoi che la routine acceda. Il corpo della risposta contiene una rappresentazione della risorsaDataset.Aggiungi il seguente oggetto JSON all'array
accessnella risorsaDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Sostituisci quanto segue:
DATASET_NAME: il nome del set di dati che contiene la UDF.PROJECT_ID: l'ID progetto del progetto che contiene la UDF.ROUTINE_NAME: il nome della routine.
(Facoltativo) Se stai autorizzando una stored procedure, allega un ruolo IAM. Questo ruolo limita l'accesso alla procedura autorizzata in base alle relative autorizzazioni. Per farlo, aggiungi
"role"all'oggetto JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Sostituisci
ROLE_NAMEcon il nome del ruolo che vuoi collegare. Puoi collegare i seguenti ruoli a una stored procedure:- Visualizzatore dei metadati delle routine BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizzatore dati routine BigQuery (
roles/bigquery.routineDataViewer) - Editor dati routine BigQuery (
roles/bigquery.routineDataEditor) - Amministratore routine BigQuery (
roles/bigquery.routineAdmin)
- Visualizzatore dei metadati delle routine BigQuery (
Chiama il metodo
dataset.updatecon la rappresentazioneDatasetmodificata.
Quote e limiti
Le routine autorizzate sono soggette ai limiti del set di dati. Per maggiori informazioni, consulta Limiti dei set di dati.
Esempio di routine autorizzata
Di seguito è riportato un esempio end-to-end di creazione e utilizzo di una UDF autorizzata.
Crea due set di dati denominati
private_datasetepublic_dataset. Per ulteriori informazioni sulla creazione di un set di dati, vedi Creazione di un set di dati.Esegui la seguente istruzione per creare una tabella denominata
private_tableinprivate_dataset:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;Esegui questa istruzione per creare una UDF denominata
count_keyinpublic_dataset. La funzione definita dall'utente include un'istruzioneSELECTsuprivate_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));Concedi il ruolo
bigquery.dataViewera un utente nel set di datipublic_dataset. Questo ruolo include l'autorizzazionebigquery.routines.get, che consente all'utente di chiamare la routine. Per informazioni su come assegnare i controlli dell'accesso a un set di dati, vedi Controllare l'accesso ai set di dati.A questo punto, l'utente dispone dell'autorizzazione per chiamare la routine
count_key, ma non può accedere alla tabella inprivate_dataset. Se l'utente tenta di chiamare la routine, riceve un messaggio di errore simile al seguente:Access Denied: Table myproject:private_dataset.private_table: User does not have permission to query table myproject:private_dataset.private_table.
Utilizzando lo strumento a riga di comando bq, esegui il comando
showcome segue:bq show --format=prettyjson private_dataset > dataset.json
L'output viene salvato in un file locale denominato
dataset.json.Modifica
dataset.jsonper aggiungere il seguente oggetto JSON all'arrayaccess:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Sostituisci
PROJECT_IDcon l'ID progetto perpublic_dataset.Utilizzando lo strumento a riga di comando bq, esegui il comando
updatecome segue:bq update --source dataset.json private_dataset
Per verificare che la funzione definita dall'utente abbia accesso a
private_dataset, l'utente può eseguire la query seguente:SELECT public_dataset.count_key('key1');