Viste autorizzate e viste materializzate
Questo documento descrive come creare viste autorizzate e viste materializzate in BigQuery.
Le viste autorizzate e le viste materializzate autorizzate ti consentono di condividere i risultati delle query con determinati utenti e gruppi senza concedere loro l'accesso ai dati di origine sottostanti. Alla vista o vista materializzata viene concesso l'accesso ai dati, anziché all'utente. Puoi anche utilizzare la query SQL che crea la vista o la vista materializzata per limitare le colonne e i campi su cui gli utenti possono eseguire query.
Quando si effettua una vista autorizzata o una vista materializzata in un altro set di dati, sia il set di dati di dati di origine sia il set di dati delle visualizzazioni autorizzate devono trovarsi nella stessa località a livello di regione.
Per informazioni sull'autorizzazione di tutte le viste in un set di dati, anziché sull'autorizzazione delle singole viste, consulta Set di dati autorizzati.
Prima di iniziare
Concedi i ruoli IAM (Identity and Access Management) che concedono agli utenti le autorizzazioni necessarie per eseguire ogni attività nel documento.
Autorizzazioni obbligatorie
Per creare o aggiornare una vista autorizzata, devi disporre delle autorizzazioni per il set di dati che contiene la vista e per il set di dati che fornisce l'accesso alla vista.
Autorizzazioni per il set di dati che contiene la vista
Le viste vengono trattate come risorse di una tabella in BigQuery, pertanto la creazione di una vista richiede le stesse autorizzazioni della tabella. Devi inoltre disporre delle autorizzazioni per eseguire query su qualsiasi tabella a cui fa riferimento la query SQL della vista.
Per creare una vista, devi disporre dell'autorizzazione IAM bigquery.tables.create
. Il ruolo IAM predefinito di roles/bigquery.dataEditor
include le autorizzazioni necessarie per creare una vista.
Inoltre, se disponi dell'autorizzazione bigquery.datasets.create
, puoi
creare viste nei set di dati che crei. Per creare una vista per dati che non sono di tua proprietà, devi disporre dell'autorizzazione bigquery.tables.getData
per quella tabella.
Per ulteriori informazioni su ruoli e autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.
Autorizzazioni sul set di dati che concede l'accesso alla vista
Per aggiornare le proprietà del set di dati, devi disporre delle seguenti autorizzazioni IAM:
bigquery.datasets.update
bigquery.datasets.setIamPolicy
(richiesto solo in caso di aggiornamento dei controlli di accesso al set di dati nella console Google Cloud)
Il ruolo IAM predefinito di roles/bigquery.dataOwner
include le autorizzazioni necessarie per aggiornare le proprietà del set di dati.
Inoltre, se disponi dell'autorizzazione bigquery.datasets.create
, puoi
aggiornare le proprietà dei set di dati che crei.
Per ulteriori informazioni su ruoli e autorizzazioni IAM in BigQuery, consulta Autorizzazioni e ruoli predefiniti.
Autorizza una vista
Per concedere l'accesso in visualizzazione a un set di dati:
Console
Vai alla pagina BigQuery nella console Google Cloud.
Nel riquadro Explorer, espandi il progetto e seleziona un set di dati.
Fai clic su
Visualizza azioni e poi su Apri.Nel riquadro Informazioni sul set di dati, fai clic su
Condivisione e poi seleziona Autorizza visualizzazioni.In Autorizza visualizzazione, digita il nome della vista da autorizzare.
Fai clic su Aggiungi autorizzazione.
Fai clic su Chiudi.
bq
Scrivi le informazioni del set di dati esistenti (inclusi i controlli di accesso) in un file JSON utilizzando il comando
bq show
. Se il set di dati si trova in un progetto diverso da quello predefinito, aggiungi l'ID progetto al nome del set di dati nel seguente formato:project_id:dataset
.bq show \ --format=prettyjson \ project_id:dataset > path_to_file
Dove:
- project_id è l'ID progetto.
- dataset è il nome del tuo set di dati.
- path_to_file è il percorso del file JSON sulla tua macchina locale.
Esempi:
Inserisci il comando seguente per scrivere i controlli di accesso per
mydataset
in un file JSON.mydataset
è nel tuo progetto predefinito.bq show --format=prettyjson mydataset > /tmp/mydataset.json
Inserisci il comando seguente per scrivere i controlli di accesso per
mydataset
in un file JSON.mydataset
è inmyotherproject
.bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
Aggiungi la visualizzazione autorizzata alla sezione "Accesso" del file JSON.
Ad esempio, la sezione di accesso del file JSON di un set di dati sarà la seguente:
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" } { "role": "READER", "specialGroup": "allAuthenticatedUsers" } { "role": "READER", "domain": "[DOMAIN_NAME]" } { "role": "WRITER", "userByEmail": "[USER_EMAIL]" } { "role": "READER", "groupByEmail": "[GROUP_EMAIL]" }, { "view":{ "datasetId": "[DATASET_NAME]", "projectId": "[PROJECT_NAME]", "tableId": "[VIEW_NAME]" } } ], }
Quando le modifiche sono complete, utilizza il comando
bq update
e includi il file JSON utilizzando il flag--source
. Se il set di dati si trova in un progetto diverso da quello predefinito, aggiungi l'ID progetto al nome del set di dati nel seguente formato:project_id:dataset
.bq update \ --source path_to_file \ project_id:dataset
Dove:
- path_to_file è il percorso del file JSON sulla tua macchina locale.
- project_id è l'ID progetto.
- dataset è il nome del tuo set di dati.
Esempi:
Inserisci il comando seguente per aggiornare i controlli di accesso per
mydataset
.mydataset
è nel tuo progetto predefinito.bq update --source /tmp/mydataset.json mydataset
Inserisci il comando seguente per aggiornare i controlli di accesso per
mydataset
.mydataset
è inmyotherproject
.bq update --source /tmp/mydataset.json myotherproject:mydataset
Per verificare le modifiche controllo dell'accesso#39;accesso, inserisci di nuovo il comando
show
senza scrivere le informazioni in un file.bq show --format=prettyjson [DATASET]
o
bq show --format=prettyjson [PROJECT_ID]:[DATASET]
API
Chiama datasets.patch
e utilizza la proprietà access
per aggiornare i controlli di accesso. Per ulteriori informazioni, consulta Set di dati.
Poiché il metodo datasets.update
sostituisce l'intera risorsa del set di dati, datasets.patch
è il metodo preferito per aggiornare i controlli dell'accesso.
Go
Prima di provare questo esempio, segui le istruzioni di configurazione di Go disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Go.
Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Java.
Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Python.
Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.
Rimuovere l'autorizzazione a una vista
Per rimuovere l'autorizzazione da una vista:
Console
Vai alla pagina BigQuery nella console Google Cloud.
Nel riquadro Explorer, espandi il progetto e seleziona un set di dati.
Fai clic su > Autorizza visualizzazioni.
CondivisioneFai clic su
Rimuovi autorizzazione.Fai clic su Chiudi.
Quote e limiti
- Le viste autorizzate sono soggette a limiti del set di dati. Per ulteriori informazioni, consulta Limiti dei set di dati.
- Se rimuovi una vista autorizzata, possono trascorrere fino a 24 ore prima che tutti i riferimenti alla visualizzazione vengano rimossi dal sistema. Per evitare errori, attendi 24 ore prima di riutilizzare il nome di una vista rimossa oppure crea un nome univoco per la visualizzazione.
Forzare l'accesso a livello di riga con una vista
Le visualizzazioni possono essere utilizzate per limitare l'accesso a determinate colonne (campi). Se vuoi
limitare l'accesso a singole righe della tabella, non è necessario creare
visualizzazioni separate per ogni utente o gruppo. Puoi invece utilizzare la funzione SESSION_USER()
per restituire l'indirizzo email dell'utente corrente.
Per visualizzare righe diverse per utenti diversi, aggiungi alla tabella un altro campo contenente l'utente autorizzato a visualizzare la riga. Poi, crea una vista che utilizza
la funzione SESSION_USER()
. Nell'esempio seguente, i nomi utente vengono
archiviati nel campo allowed_viewer
:
SELECT COLUMN_1, COLUMN_2 FROM `dataset.view` WHERE allowed_viewer = SESSION_USER()
Il limite di questo approccio è che puoi concedere l'accesso a un solo utente alla volta. Puoi aggirare questa limitazione impostando allowed_viewer
un campo ripetuto. Questo approccio consente di fornire un elenco di utenti per ogni riga.
Tuttavia, anche se utilizzi un campo ripetuto, la memorizzazione dei nomi utente nella tabella richiede comunque il monitoraggio manuale dei singoli utenti che hanno accesso a ogni riga.
Compila invece il campo allowed_viewer
con i nomi dei gruppi e crea una tabella separata che mappa i gruppi agli utenti. La tabella che mappa i gruppi agli utenti
avrebbe uno schema che memorizza i nomi e i nomi utente dei gruppi. Ad esempio:
{group:string, user_name:string}
. Questo approccio consente di gestire le informazioni su utenti e gruppi separatamente dalla tabella che contiene i dati.
Se la tabella di mappatura è denominata private.access_control
, la query SQL utilizzata per creare la vista autorizzata sarebbe:
SELECT c.customer, c.id FROM `private.customers` c INNER JOIN ( SELECT group FROM `private.access_control` WHERE SESSION_USER() = user_name) g ON c.allowed_group = g.group
Passaggi successivi
- Per un tutorial sulla creazione di una vista autorizzata, consulta Creare una vista autorizzata.
- Per informazioni sulla creazione delle viste, consulta Creazione delle viste.
- Per informazioni sulla creazione delle viste materializzate, consulta la sezione Creare viste materializzate.
- Per informazioni su come ottenere i metadati delle visualizzazioni, consulta Ottenere informazioni sulle viste.
- Per ulteriori informazioni sulla gestione delle viste, consulta la sezione Gestione delle viste.
- Per informazioni su come autorizzare tutte le viste in un set di dati, consulta Set di dati autorizzati.