Routine autorizzate
Le routine autorizzate ti consentono di condividere i risultati di una 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 il valore di una tabella e utilizzarlo in un calcolo.
Per impostazione predefinita, se un utente richiama una routine, deve avere accesso in lettura i dati nella tabella. In alternativa, puoi autorizzare la routine ad accedere al set di dati contenente la tabella a cui si fa riferimento. Una routine autorizzata può eseguire query sulle tabelle del set di dati, anche se l'utente che richiama 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 pannello di navigazione, nella sezione Explorer, espandi la progetto e seleziona un set di dati.
Nel riquadro dei dettagli, espandi Condivisione e fai clic su Autorizzare le 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 show
per ottenere la rappresentazione JSON del set di dati a cui vuoi accedere la routine. L'output del comando è un rappresentazione JSON del codiceDataset
. Salva il risultato in un file locale.bq show --format=prettyjson TARGET_DATASET > dataset.json
Sostituisci TARGET_DATASET con il nome del set di dati a cui può accedere la routine.
Modifica il file per aggiungere il seguente oggetto JSON all'array
access
in la risorsaDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Dove:
- DATASET_NAME è il nome del set di dati contenente la routine.
- PROJECT_ID è l'ID del progetto contenente la routine.
- ROUTINE_NAME è il nome della routine.
Usa il comando
bq update
per aggiornare il set di dati.bq update --source dataset.json TARGET_DATASET
API
Chiama il
datasets.get
per recuperare il set di dati a cui vuoi accedere la routine. Il corpo della risposta contiene una rappresentazione della risorsaDataset
.Aggiungi il seguente oggetto JSON all'array
access
inDataset
risorsa:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Dove:
- DATASET_NAME è il nome del set di dati che contiene la funzione definita dall'utente.
- PROJECT_ID è l'ID del progetto che contiene della funzione definita dall'utente.
- ROUTINE_NAME è il nome della routine.
Chiama il metodo
dataset.update
con la rappresentazioneDataset
modificata.
Quote e limiti
Le routine autorizzate sono soggette a limiti di set di dati. Per ulteriori informazioni, vedi Limiti dei set di dati.
Esempio di routine autorizzata
Di seguito è riportato un esempio end-to-end di creazione e utilizzo di una funzione definita dall'utente autorizzata.
Crea due set di dati denominati
private_dataset
epublic_dataset
. Per maggiori informazioni informazioni sulla creazione di un set di dati, consulta Creazione di un set di dati.Esegui la seguente istruzione per creare una tabella denominata
private_table
inprivate_dataset
:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
Esegui la seguente istruzione per creare una UDF denominata
count_key
inpublic_dataset
. La UDF include un'istruzioneSELECT
suprivate_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.dataViewer
a un utente inpublic_dataset
del set di dati. Questo ruolo include l'autorizzazionebigquery.routines.get
, che permette all'utente di chiamare la routine. Per informazioni su come assegnare i controlli di accesso a un set di dati, consulta Controllo dell'accesso ai set di dati.A questo punto, l'utente ha l'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.
Con lo strumento a riga di comando bq, esegui il comando
show
come segue:bq show --format=prettyjson private_dataset > dataset.json
L'output viene salvato in un file locale denominato
dataset.json
.Modifica
dataset.json
per aggiungere il seguente oggetto JSON aaccess
array:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Sostituisci PROJECT_ID con l'ID progetto per
public_dataset
.Utilizzando lo strumento a riga di comando bq, esegui il comando
update
come segue:bq update --source dataset.json private_dataset
Per verificare che la funzione UDF abbia accesso a
private_dataset
, l'utente può eseguire la seguente query:SELECT public_dataset.count_key('key1');