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 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. per accedere al set di dati che contiene la tabella di riferimento. Una routine autorizzata può eseguire query sulle tabelle nel set di dati, anche se l'utente che chiama la routine non possono eseguire query direttamente su queste tabelle.

È possibile autorizzare i seguenti tipi di routine:

Autorizza routine

Per autorizzare una routine, usa la console Google Cloud, lo strumento a riga di comando bq o l'API REST:

Console

  1. Vai alla pagina BigQuery nella console Google Cloud.

    Vai a BigQuery

  2. Nel pannello di navigazione, nella sezione Explorer, espandi la progetto e seleziona un set di dati.

  3. Nel riquadro dei dettagli, espandi Condivisione e fai clic su Autorizzare le routine.

  4. Nella pagina Routine autorizzate, nella sezione Autorizza routine seleziona il progetto, il set di dati e la routine per il che vuoi autorizzare.

  5. Fai clic su Aggiungi autorizzazione.

bq

  1. 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 codice Dataset. 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.

  2. Modifica il file per aggiungere il seguente oggetto JSON all'array access in la risorsa Dataset:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }
    

    Dove:

    • DATASET_NAME è il nome del set di dati che contiene una nuova routine.
    • PROJECT_ID è l'ID del progetto che contiene la routine.
    • ROUTINE_NAME è il nome della routine.
  3. Usa il comando bq update per aggiornare il set di dati.

    bq update --source dataset.json TARGET_DATASET
    

API

  1. Chiama il datasets.get per recuperare il set di dati a cui vuoi accedere la routine. La il corpo della risposta contiene una rappresentazione Dataset.

  2. Aggiungi il seguente oggetto JSON all'array access in Dataset 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.
  3. Chiama il dataset.update con la rappresentazione Dataset 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.

  1. Crea due set di dati denominati private_dataset e public_dataset. Per ulteriori informazioni informazioni sulla creazione di un set di dati, consulta Creazione di un set di dati.

  2. Esegui questa istruzione per creare una tabella denominata private_table in private_dataset:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. Esegui questa istruzione per creare una funzione definita dall'utente denominata count_key in public_dataset. La funzione definita dall'utente include un'istruzione SELECT su private_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));
    
  4. Concedi il ruolo bigquery.dataViewer a un utente in public_dataset del set di dati. Questo ruolo include l'autorizzazione bigquery.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.

  5. A questo punto, l'utente è autorizzato a chiamare la routine count_key ma non riesce ad accedere alla tabella in private_dataset. Se l'utente prova a chiama la routine, riceveranno 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.
    
  6. Utilizzando 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.

  7. Modifica dataset.json per aggiungere il seguente oggetto JSON a access array:

    {
     "routine": {
       "datasetId": "public_dataset",
       "projectId": "PROJECT_ID",
       "routineId": "count_key"
     }
    }
    

    Sostituisci PROJECT_ID con l'ID progetto per public_dataset.

  8. Utilizzando lo strumento a riga di comando bq, esegui il comando update come segue:

    bq update --source dataset.json private_dataset
    
  9. Per verificare che la funzione definita dall'utente abbia accesso a private_dataset, l'utente può eseguire seguente query:

    SELECT public_dataset.count_key('key1');