Rutinas autorizadas

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

De forma predeterminada, si un usuario invoca una rutina, debe tener acceso para leer los datos de la tabla. Como alternativa, puedes autorizar la rutina para acceder 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, incluso si el usuario que llama a la rutina no puede consultar esas tablas directamente.

Se pueden autorizar los siguientes tipos de rutinas:

Autoriza rutinas

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

Console

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

    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, expande Compartir y 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 Rutina para la rutina que deseas autorizar.

  5. Haz clic en Agregar autorización.

bq

  1. Usa el comando bq show para obtener la representación JSON del conjunto de datos al que deseas 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
    

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

  2. Edita el archivo para agregar el siguiente objeto JSON al array access en el 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 recuperar el conjunto de datos al que deseas que acceda la rutina. El cuerpo de la respuesta contiene una representación del recurso Dataset.

  2. Agrega el siguiente objeto JSON al array access en el 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 UDF.
    • PROJECT_ID es el ID del proyecto que contiene la UDF.
    • 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 de creación y uso de una UDF autorizada.

  1. Crea dos conjuntos de datos llamados private_dataset y public_dataset. Para obtener más información sobre la creación de un conjunto de datos, consulta Crea un conjunto de datos.

  2. Ejecuta la siguiente declaració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 declaración para crear una UDF llamada count_key en public_dataset. La UDF incluye una declaració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. Otorga la función bigquery.dataViewer a un usuario en el conjunto de datos public_dataset. Esta función incluye el permiso bigquery.routines.get, que le permite al usuario llamar a la rutina. Si deseas obtener información para asignar controles de acceso a un conjunto de datos, consulta Controla 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 en 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 de bq, ingresa el comando show como se muestra a continuación:

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

    El resultado se guarda en un archivo local llamado dataset.json.

  7. Edita dataset.json para agregar el siguiente objeto JSON al array access:

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

    Reemplaza PROJECT_ID por el ID del proyecto para public_dataset.

  8. Con la herramienta de línea de comandos de bq, ingresa el comando update como se muestra a continuación:

    bq update --source dataset.json private_dataset
    
  9. Para verificar que la UDF tenga acceso a private_dataset, el usuario puede ejecutar la siguiente consulta:

    SELECT public_dataset.count_key('key1');