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 su 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 della 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

  1. Vai alla pagina BigQuery nella console Google Cloud.

    Vai a BigQuery

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

  3. Nel riquadro dei dettagli, espandi Condivisione, quindi fai clic su Autorizza routine.

  4. Nella pagina Routine autorizzate, nella sezione Autorizza routine, seleziona Progetto, Set di dati e Routine per la routine 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 che la routine acceda. L'output del comando è una representatione JSON della risorsa 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 nella risorsa Dataset:

    {
     "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.
  3. Utilizza il comando bq update per aggiornare il set di dati.

    bq update --source dataset.json TARGET_DATASET

API

  1. Chiama il metodo datasets.get per recuperare il set di dati a cui vuoi che la routine acceda. Il corpo della risposta contiene una rappresentazione della risorsa Dataset.

  2. Aggiungi il seguente oggetto JSON all'array access nella risorsa Dataset:

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

    Dove:

    • DATASET_NAME è il nome del set di dati che contiene la UDF.
    • PROJECT_ID è l'ID del progetto contenente la UDF.
    • ROUTINE_NAME è il nome della routine.
  3. Chiama il metodo dataset.update con la rappresentazione Dataset modificata.

Quote e limiti

Le routine autorizzate sono soggette ai limiti del set di dati. Per ulteriori informazioni, consulta Limiti dei set di dati.

Esempio di routine autorizzata

Di seguito è riportato un esempio end-to-end della creazione e dell'utilizzo di una UDF autorizzata.

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

  2. Esegui la seguente 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 la seguente istruzione per creare una UDF denominata count_key in public_dataset. La UDF include un'istruzione SELECT in 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 del set di dati public_dataset. Questo ruolo include l'autorizzazione bigquery.routines.get, che consente all'utente di chiamare la routine. Per informazioni su come assegnare i controlli di accesso a un set di dati, consulta Controllare l'accesso ai set di dati.

  5. A questo punto, l'utente ha l'autorizzazione per chiamare la routine count_key, ma non può accedere alla tabella in private_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.
    
  6. 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.

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

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

    Sostituisci PROJECT_ID con l'ID progetto di public_dataset.

  8. Con 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 UDF abbia accesso a private_dataset, l'utente può eseguire la seguente query:

    SELECT public_dataset.count_key('key1');