Autorisierte Routinen
Mit autorisierten Routinen können Sie Abfrageergebnisse für bestimmte Nutzer oder Gruppen freigeben, ohne ihnen Zugriff auf die zugrunde liegenden Tabellen zu gewähren, mit denen die Ergebnisse generiert wurden. Beispielsweise kann eine autorisierte Routine eine Aggregation von Daten berechnen oder einen Tabellenwert abrufen und diesen Wert in einer Berechnung verwenden.
Wenn ein Nutzer eine Routine aufruft, muss der Nutzer standardmäßig Zugriff auf die Daten in der Tabelle haben. Alternativ können Sie die Routine autorisieren, um auf das Dataset zuzugreifen, das die referenzierte Tabelle enthält. Eine autorisierte Routine kann die Tabellen im Dataset abfragen, auch wenn der Nutzer, der die Routine aufruft, diese Tabellen nicht direkt abfragen kann.
Die folgenden Arten von Routinen können autorisiert werden:
Routinen autorisieren
Zum Autorisieren einer Routine können Sie die Google Cloud Console, das bq-Befehlszeilentool oder die REST API verwenden:
Console
Rufen Sie in der Google Cloud Console die Seite "BigQuery" auf.
Maximieren Sie im Navigationsbereich im Abschnitt Explorer Ihr Projekt und wählen Sie ein Dataset aus.
Maximieren Sie im Detailbereich die Option Freigabe und klicken Sie dann auf Autorisierte Routinen.
Wählen Sie auf der Seite Autorisierte Routinen im Abschnitt Routine autorisieren die Option Projekt, Dataset und Routine für die Routine aus, die Sie autorisieren möchten.
Klicken Sie auf Autorisierung hinzufügen.
bq
Verwenden Sie den Befehl
bq show
, um die JSON-Darstellung des Datasets abzurufen, auf das die Routine zugreifen soll. Die Ausgabe des Befehls ist eine JSON-Darstellung der RessourceDataset
. Speichern Sie das Ergebnis in einer lokalen Datei.bq show --format=prettyjson TARGET_DATASET > dataset.json
Ersetzen Sie TARGET_DATASET durch den Namen des Datasets, auf das die Routine zugreifen kann.
Bearbeiten Sie die Datei, um dem
access
-Array in derDataset
-Ressource das folgende JSON-Objekt hinzuzufügen:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Dabei gilt:
- DATASET_NAME ist der Name des Datasets, das die Tabelle enthält.
- PROJECT_ID ist die Projekt-ID des Projekts, das die Routine enthält.
- ROUTINE_NAME ist der Name der Routine.
Aktualisieren Sie das Dataset mit dem Befehl
bq update
.bq update --source dataset.json TARGET_DATASET
API
Rufen Sie die Methode
datasets.get
auf, um das Dataset abzurufen, auf das die Routine zugreifen soll. Der Antworttext enthält eine Darstellung derDataset
-Ressource.Fügen Sie dem
access
-Array in derDataset
-Ressource das folgende JSON-Objekt hinzu:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Dabei gilt:
- DATASET_NAME ist der Name des Datasets, das die UDF enthält.
- PROJECT_ID ist die Projekt-ID des Projekts, das die UDF enthält.
- ROUTINE_NAME ist der Name der Routine.
Rufen Sie die Methode
dataset.update
mit der geändertenDataset
-Darstellung auf.
Kontingente und Limits
Autorisierte Routinen unterliegen den Dataset-Limits. Weitere Informationen finden Sie unter Dataset-Limits.
Beispiel für eine autorisierte Routine
Im Folgenden finden Sie ein End-to-End-Beispiel für das Erstellen und Verwenden einer autorisierten UDF.
Erstellen Sie zwei Datasets mit den Namen
private_dataset
undpublic_dataset
. Weitere Informationen zu Dataset erstellen.Führen Sie die folgende Anweisung aus, um eine Tabelle mit dem Namen
private_table
inprivate_dataset
zu erstellen:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
Führen Sie die folgende Anweisung aus, um eine UDF mit dem Namen
count_key
inpublic_dataset
zu erstellen. Die UDF enthält eineSELECT
-Anweisung fürprivate_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));
Weisen Sie einem Nutzer des Datasets
public_dataset
die Rollebigquery.dataViewer
zu. Diese Rolle enthält die Berechtigungbigquery.routines.get
, mit der der Nutzer die Routine aufrufen kann. Weitere Informationen zum Zuweisen von Zugriffssteuerungen für Datasets finden Sie unter Zugriff auf Datasets steuern.An diesem Punkt hat der Nutzer die Berechtigung, die Routine
count_key
aufzurufen, kann jedoch nicht auf die Tabelle inprivate_dataset
zugreifen. Wenn der Nutzer versucht, die Routine aufzurufen, erhält er eine Fehlermeldung ähnlich der folgenden:Access Denied: Table myproject:private_dataset.private_table: User does not have permission to query table myproject:private_dataset.private_table.
Führen Sie mit dem bq-Befehlszeilentool den Befehl
show
so aus:bq show --format=prettyjson private_dataset > dataset.json
Die Ausgabe wird in einer lokalen Datei mit dem Namen
dataset.json
gespeichert.Bearbeiten Sie
dataset.json
, um demaccess
-Array das folgende JSON-Objekt hinzuzufügen:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Ersetzen Sie PROJECT_ID durch die Projekt-ID für
public_dataset
.Führen Sie mit dem bq-Befehlszeilentool den Befehl
update
so aus:bq update --source dataset.json private_dataset
Der Nutzer kann die folgende Abfrage ausführen, um zu prüfen, ob die UDF Zugriff auf
private_dataset
hat:SELECT public_dataset.count_key('key1');