Autorisierte Routinen
Mit autorisierten Routinen können Sie Abfrageergebnisse für bestimmte Nutzer oder Gruppen freigeben, ohne ihnen direkten Zugriff auf die zugrunde liegenden Tabellen zu gewähren. Eine Routine kann beispielsweise Aggregationen berechnen oder einen Tabellenwert abrufen und diesen Wert in einer Berechnung verwenden.
Standardmäßig benötigen Nutzer Lesezugriff auf die referenzierten Daten, um eine Routine auszuführen. Alternativ können Sie die Routine autorisieren, um direkt auf das enthaltende Dataset zuzugreifen. So können Nutzer die Routine ohne Berechtigungen auf Tabellenebene ausführen. Sie können Tabellenfunktionen, benutzerdefinierte Funktionen (UDFs) und gespeicherte Prozeduren autorisieren.
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.
Klicken Sie im linken Bereich auf Explorer:

Wenn der linke Bereich nicht angezeigt wird, klicken Sie auf Linken Bereich maximieren, um ihn zu öffnen.
Maximieren Sie im Bereich Explorer Ihr Projekt, klicken Sie auf Datasets und wählen Sie dann ein Dataset aus.
Klicken Sie im Detailbereich auf Freigeben > Routinen autorisieren.
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_DATASETdurch 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" } }
Ersetzen Sie Folgendes:
DATASET_NAME: der Name des Datasets, das die Routine enthält.PROJECT_ID: die Projekt-ID des Projekts, das die Routine enthält.ROUTINE_NAME: Der Name der Routine
Optional: Wenn Sie eine gespeicherte Prozedur autorisieren, hängen Sie eine IAM-Rolle an. Diese Rolle beschränkt den Zugriff auf die autorisierte Prozedur basierend auf ihren Berechtigungen. Fügen Sie dazu
"role"zum JSON-Objekt hinzu:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Ersetzen Sie
ROLE_NAMEdurch den Namen der Rolle, die Sie anhängen möchten. Sie können einer gespeicherten Prozedur die folgenden Rollen zuweisen:- BigQuery Routine Metadata Viewer (
roles/bigquery.routineMetadataViewer) - BigQuery Routine Data Viewer (
roles/bigquery.routineDataViewer) - BigQuery Routine Data Editor (
roles/bigquery.routineDataEditor) - BigQuery Routine Admin (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
Aktualisieren Sie das Dataset mit dem Befehl
bq update:bq update --source dataset.json TARGET_DATASET
API
Rufen Sie die Methode
datasets.getauf, 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" } }
Ersetzen Sie Folgendes:
DATASET_NAME: der Name des Datasets, das die UDF enthält.PROJECT_ID: die Projekt-ID des Projekts, das die UDF enthält.ROUTINE_NAME: Der Name der Routine
Optional: Wenn Sie eine gespeicherte Prozedur autorisieren, hängen Sie eine IAM-Rolle an. Diese Rolle beschränkt den Zugriff auf die autorisierte Prozedur basierend auf ihren Berechtigungen. Fügen Sie dazu dem JSON-Objekt
"role"hinzu:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Ersetzen Sie
ROLE_NAMEdurch den Namen der Rolle, die Sie anhängen möchten. Sie können einer gespeicherten Prozedur die folgenden Rollen zuweisen:- BigQuery Routine Metadata Viewer (
roles/bigquery.routineMetadataViewer) - BigQuery Routine Data Viewer (
roles/bigquery.routineDataViewer) - BigQuery Routine Data Editor (
roles/bigquery.routineDataEditor) - BigQuery Routine Admin (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
Rufen Sie die Methode
dataset.updatemit der geändertenDataset-Darstellung auf.
Kontingente und Limits
Autorisierte Routinen unterliegen den Dataset-Limits. Weitere Informationen finden Sie unter Dataset-Limits.
Wenn Sie eine Routine aktualisieren, läuft die Autorisierung der vorhandenen autorisierten Routinen ab. BigQuery entfernt veraltete Autorisierungseinträge für autorisierte Routinen automatisch innerhalb von 24 Stunden. Wenn Sie die Einträge sofort aktualisieren möchten, müssen Sie den Eintrag manuell aus der Liste „Derzeit autorisierte Routinen“ löschen, bevor Sie ihn neu autorisieren.
Beschränkungen
Sie können keine autorisierte Routine in einem sekundären Replikat erstellen. Weitere Informationen finden Sie unter Ressourcenverhalten bei der Dataset-Replikation.
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_datasetundpublic_dataset. Weitere Informationen zu Dataset erstellen.Führen Sie die folgende Anweisung aus, um eine Tabelle mit dem Namen
private_tableinprivate_datasetzu 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_keyinpublic_datasetzu 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_datasetdie Rollebigquery.dataViewerzu. 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 Mit Dataset-Zugriffssteuerungen arbeiten.An diesem Punkt hat der Nutzer die Berechtigung, die Routine
count_keyaufzurufen, kann jedoch nicht auf die Tabelle inprivate_datasetzugreifen. 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
showso aus:bq show --format=prettyjson private_dataset > dataset.json
Die Ausgabe wird in einer lokalen Datei mit dem Namen
dataset.jsongespeichert.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_IDdurch die Projekt-ID fürpublic_dataset.Führen Sie mit dem bq-Befehlszeilentool den Befehl
updateso 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_datasethat:SELECT public_dataset.count_key('key1');