Funzioni autorizzate
Le funzioni autorizzate consentono di condividere i risultati delle query con determinati utenti o gruppi senza concedere a questi o ai gruppi l'accesso alle tabelle sottostanti. Ad esempio, una funzione autorizzata può calcolare un'aggregazione sui dati o cercare un valore di tabella e utilizzare tale valore in un calcolo.
Per impostazione predefinita, se una funzione definita dall'utente (UDF) o una funzione tabella esegue una query su una tabella, un utente che richiama tale funzione deve avere l'autorizzazione a leggere i dati nella tabella. In alternativa, puoi autorizzare la funzione ad accedere al set di dati che contiene la tabella di riferimento. Una funzione autorizzata può eseguire query sulle tabelle nel set di dati, anche se l'utente che chiama la funzione non può interrogare direttamente tali tabelle.
Autorizzare una funzione
Puoi autorizzare sia le funzioni UDF e le funzioni delle tabelle. Per autorizzare una funzione, puoi utilizzare la console Google Cloud, l'API REST o lo strumento a riga di comando bq
:
Console
Vai alla pagina BigQuery nella console Google Cloud.
Nel pannello di navigazione, nella sezione Risorse, espandi il progetto e seleziona un set di dati.
Nel riquadro dei dettagli, fai clic su Autorizza routine.
Nella pagina Routine autorizzate, nella sezione Autorizza routine, seleziona l'ID progetto, l'ID set di dati e l'ID routine per la funzione che vuoi autorizzare.
Fai clic su Aggiungi autorizzazione.
API
Chiama il metodo
datasets.get
per recuperare il set di dati a cui vuoi accedere alla funzione. Il corpo della risposta contiene una rappresentazione della risorsaDataset
.Aggiungi il seguente oggetto JSON all'array
access
nella risorsaDataset
:{ "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 l'UDF.
- ROUTINE_NAME è il nome della funzione.
Chiama il metodo
dataset.update
con la rappresentazioneDataset
modificata.
bq
Utilizza il comando
bq show
per ottenere la rappresentazione JSON del set di dati a cui vuoi che la funzione 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_DATASET con il nome del set di dati a cui avrà accesso la funzione.
Modifica il file per aggiungere il seguente oggetto JSON all'array
access
nella risorsaDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Dove:
- DATASET_NAME è il nome del set di dati che contiene la funzione.
- PROJECT_ID è l'ID del progetto che contiene la funzione.
- ROUTINE_NAME è il nome della funzione.
Usa il comando
bq update
per aggiornare il set di dati.bq update --source dataset.json TARGET_DATASET
Esempio di funzione 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 ulteriori 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 funzione definita dall'utente denominata
count_key
inpublic_dataset
. L'UDF include un'istruzioneSELECT
inprivate_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 nel set di datipublic_dataset
. Questo ruolo include l'autorizzazionebigquery.routines.get
, che consente all'utente di chiamare la funzione. 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 funzione
count_key
, ma non può accedere alla tabella inprivate_dataset
. Se l'utente cerca di chiamare la funzione, 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 comandoshow
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 all'arrayaccess
:{ "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 comandoupdate
come segue:bq update --source dataset.json private_dataset
Per verificare che l'UDF abbia accesso a
private_dataset
, l'utente può eseguire la seguente query:SELECT public_dataset.count_key('key1');