Rutinas autorizadas

Las rutinas autorizadas te permiten compartir los resultados de las consultas con usuarios o grupos específicos sin darles acceso a las tablas subyacentes que han generado los resultados. Por ejemplo, una rutina autorizada puede calcular una agregación de datos o buscar un valor en una tabla y usarlo en un cálculo.

De forma predeterminada, si un usuario invoca una rutina, debe tener acceso de lectura a los datos de la tabla. También puedes autorizar la rutina para que acceda al conjunto de datos que contiene la tabla a la que se hace referencia. Una rutina autorizada puede consultar las tablas del conjunto de datos, aunque el usuario que llama a la rutina no pueda consultar esas tablas directamente.

Se pueden autorizar los siguientes tipos de rutinas:

Autorizar rutinas

Para autorizar una rutina, usa la consola de Google Cloud , la herramienta de línea de comandos bq o la API REST:

Consola

  1. Ve a la página de BigQuery en la Google Cloud consola.

    Ir a BigQuery

  2. En el panel de navegación, en la sección Explorador, expande tu proyecto y selecciona un conjunto de datos.

  3. En el panel de detalles, despliega Compartir y, a continuación, haz clic en Autorizar rutinas.

  4. En la página Rutinas autorizadas, en la sección Autorizar rutina, selecciona el Proyecto, el Conjunto de datos y la Rutina que quieras autorizar.

  5. Haz clic en Añadir autorización.

bq

  1. Usa el comando bq show para obtener la representación JSON del conjunto de datos al que quieres que acceda la rutina. El resultado del comando es una representación JSON del recurso Dataset. Guarda el resultado en un archivo local.

    bq show --format=prettyjson TARGET_DATASET > dataset.json

    Sustituye TARGET_DATASET por el nombre del conjunto de datos al que puede acceder la rutina.

  2. Edita el archivo para añadir el siguiente objeto JSON a la matriz access del recurso Dataset:

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

    Donde:

    • DATASET_NAME es el nombre del conjunto de datos que contiene la rutina.
    • PROJECT_ID es el ID del proyecto que contiene la rutina.
    • ROUTINE_NAME es el nombre de la rutina.
  3. Usa el comando bq update para actualizar el conjunto de datos.

    bq update --source dataset.json TARGET_DATASET

API

  1. Llama al método datasets.get para obtener el conjunto de datos al que quieres que acceda la rutina. El cuerpo de la respuesta contiene una representación del recurso Dataset.

  2. Añade el siguiente objeto JSON a la matriz access del recurso Dataset:

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

    Donde:

    • DATASET_NAME es el nombre del conjunto de datos que contiene la función definida por el usuario.
    • PROJECT_ID es el ID del proyecto que contiene la función definida por el usuario.
    • ROUTINE_NAME es el nombre de la rutina.
  3. Llama al método dataset.update con la representación Dataset modificada.

Cuotas y límites

Las rutinas autorizadas están sujetas a los límites de los conjuntos de datos. Para obtener más información, consulta Límites de conjuntos de datos.

Ejemplo de rutina autorizada

A continuación, se muestra un ejemplo completo de cómo crear y usar una función definida por el usuario autorizada.

  1. Crea dos conjuntos de datos llamados private_dataset y public_dataset. Para obtener más información sobre cómo crear un conjunto de datos, consulta el artículo Crear un conjunto de datos.

  2. Ejecuta la siguiente instrucción para crear una tabla llamada private_table en private_dataset:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. Ejecuta la siguiente instrucción para crear una función definida por el usuario llamada count_key en public_dataset. La función definida por el usuario incluye una instrucción SELECT en 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. Asigna el rol bigquery.dataViewer a un usuario en el conjunto de datos public_dataset. Este rol incluye el permiso bigquery.routines.get, que permite al usuario llamar a la rutina. Para obtener información sobre cómo asignar controles de acceso a un conjunto de datos, consulta el artículo Controlar el acceso a los conjuntos de datos.

    .
  5. En este punto, el usuario tiene permiso para llamar a la rutina count_key, pero no puede acceder a la tabla de private_dataset. Si el usuario intenta llamar a la rutina, recibirá un mensaje de error similar al siguiente:

    Access Denied: Table myproject:private_dataset.private_table: User does
    not have permission to query table myproject:private_dataset.private_table.
    
  6. Con la herramienta de línea de comandos bq, ejecuta el comando show de la siguiente manera:

    bq show --format=prettyjson private_dataset > dataset.json

    La salida se guarda en un archivo local llamado dataset.json.

  7. Edita dataset.json para añadir el siguiente objeto JSON a la matriz access:

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

    Sustituye PROJECT_ID por el ID del proyecto de public_dataset.

  8. Con la herramienta de línea de comandos bq, ejecuta el comando update de la siguiente manera:

    bq update --source dataset.json private_dataset
  9. Para verificar que la función definida por el usuario tiene acceso a private_dataset, el usuario puede ejecutar la siguiente consulta:

    SELECT public_dataset.count_key('key1');