Autorisierte Funktionen

Mit autorisierten Funktionen können Sie Abfrageergebnisse für bestimmte Nutzer oder Gruppen freigeben, ohne diesen Nutzern oder Gruppen Zugriff auf die zugrunde liegenden Tabellen zu gewähren. Beispielsweise kann eine autorisierte Funktion eine Aggregation von Daten berechnen oder einen Tabellenwert abrufen und diesen Wert in einer Berechnung verwenden.

Wenn eine benutzerdefinierte Funktion (UDF) oder Tabellenfunktion eine Tabelle abfragt, muss ein Nutzer, der diese Funktion aufruft, standardmäßig Berechtigung zum Lesen der Daten in der Tabelle haben. Alternativ können Sie die Funktion autorisieren, um auf das Dataset zuzugreifen, das die referenzierte Tabelle enthält. Eine autorisierte Funktion kann die Tabellen im Dataset abfragen, auch wenn der Nutzer, der die Funktion aufruft, diese Tabellen nicht direkt abfragen kann.

Funktion autorisieren

Sie können sowohl UDFs als auch Tabellenfunktionen autorisieren. Zum Autorisieren einer Funktion können Sie die Google Cloud Console, die REST API oder das bq-Befehlszeilentool verwenden:

Console

  1. Rufen Sie in der Google Cloud Console die Seite "BigQuery" auf.

    BigQuery aufrufen

  2. Maximieren Sie im Navigationsbereich im Abschnitt Ressourcen Ihr Projekt und wählen Sie ein Dataset aus.

  3. Klicken Sie im Detailbereich auf Routinen autorisieren.

  4. Wählen Sie auf der Seite Autorisierte Routinen im Abschnitt Routine autorisieren die Projekt-ID, die Dataset-ID und die Routine-ID für die Funktion aus, die Sie autorisieren möchten.

  5. Klicken Sie auf Autorisierung hinzufügen.

API

  1. Rufen Sie die Methode datasets.get auf, um das Dataset abzurufen, auf das die Funktion zugreifen soll. Der Antworttext enthält eine Darstellung der Dataset-Ressource.

  2. Fügen Sie dem access-Array in der Dataset-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 Funktion.
  3. Rufen Sie die Methode dataset.update mit der geänderten Dataset-Darstellung auf.

bq

  1. Verwenden Sie den Befehl bq show, um die JSON-Darstellung des Datasets abzurufen, auf das die Funktion zugreifen soll. Die Ausgabe des Befehls ist eine JSON-Darstellung der Ressource Dataset. 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 Funktion zugreifen soll.

  2. Bearbeiten Sie die Datei, um dem access-Array in der Dataset-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 Funktion enthält.
    • PROJECT_ID ist die Projekt-ID des Projekts, das die Funktion enthält.
    • ROUTINE_NAME ist der Name der Funktion.
  3. Aktualisieren Sie das Dataset mit dem Befehl bq update.

    bq update --source dataset.json TARGET_DATASET

Beispiel für eine autorisierte Funktion

Im Folgenden finden Sie ein End-to-End-Beispiel für das Erstellen und Verwenden einer autorisierten UDF.

  1. Erstellen Sie zwei Datasets mit den Namen private_dataset und public_dataset. Weitere Informationen zum Erstellen eines Datasets finden Sie unter Dataset erstellen.

  2. Führen Sie die folgende Anweisung aus, um eine Tabelle mit dem Namen private_table in private_dataset zu erstellen:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. Führen Sie die folgende Anweisung aus, um eine UDF mit dem Namen count_key in public_dataset zu erstellen. Die UDF enthält eine SELECT-Anweisung für 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. Weisen Sie einem Nutzer des Datasets public_dataset die Rolle bigquery.dataViewer zu. Diese Rolle enthält die Berechtigung bigquery.routines.get, mit der der Nutzer die Funktion aufrufen kann. Weitere Informationen zum Zuweisen von Zugriffssteuerungen für Datasets finden Sie unter Zugriff auf Datasets steuern.

  5. An diesem Punkt hat der Nutzer die Berechtigung, die Funktion count_key aufzurufen, kann jedoch nicht auf die Tabelle in private_dataset zugreifen. Wenn der Nutzer versucht, die Funktion 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.
    
  6. 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.

  7. Bearbeiten Sie dataset.json, um dem access-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.

  8. Führen Sie mit dem bq-Befehlszeilentool den Befehl update so aus:

    bq update --source dataset.json private_dataset
  9. 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');