Funciones autorizadas
Las funciones autorizadas te permiten compartir resultados de consultas con usuarios o grupos específicos sin darles a esos usuarios o grupos acceso a las tablas subyacentes. Por ejemplo, una función 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 una función definida por el usuario (UDF) o una función de tabla consulta una tabla, entonces un usuario que invoca esa función debe tener permiso para leer los datos de la tabla. Como alternativa, puedes autorizar la función para acceder al conjunto de datos que contiene la tabla a la que se hace referencia. Una función autorizada puede consultar las tablas del conjunto de datos, incluso si el usuario que llama a la función no puede consultar esas tablas directamente.
Autoriza una función
Puedes autorizar funciones de tablas y UDF. Para autorizar una función, puedes usar Google Cloud Console, la API de REST o la herramienta de línea de comandos de bq
:
Console
Ve a la página de BigQuery en Google Cloud Console.
En el panel de navegación, en la sección Recursos, expande tu proyecto y selecciona un conjunto de datos.
En el panel de detalles, haz clic en Autorizar rutinas.
En la página Rutinas autorizadas, en la sección Autorizar rutina, selecciona el ID del proyecto, el ID del conjunto de datos y el ID de la rutina que deseas autorizar.
Haz clic en Agregar autorización.
API
Llama al método
datasets.get
para recuperar el conjunto de datos al que deseas que acceda la función. El cuerpo de la respuesta contiene una representación del recursoDataset
.Agrega el siguiente objeto JSON al array
access
en el recursoDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Aquí:
- 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 función.
Llama al método
dataset.update
con la representaciónDataset
modificada.
bq
Usa el comando
bq show
para obtener la representación JSON del conjunto de datos al que deseas que acceda la función. El resultado del comando es una representación JSON del recursoDataset
. 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 tendrá acceso la función.
Edita el archivo para agregar el siguiente objeto JSON al array
access
en el recursoDataset
:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Aquí:
- DATASET_NAME es el nombre del conjunto de datos que contiene la función.
- PROJECT_ID es el ID del proyecto que contiene la función.
- ROUTINE_NAME es el nombre de la función.
Usa el comando
bq update
para actualizar el conjunto de datos.bq update --source dataset.json TARGET_DATASET
Ejemplo de función autorizada
A continuación, se muestra un ejemplo de creación y uso de una UDF autorizada.
Crea dos conjuntos de datos llamados
private_dataset
ypublic_dataset
. Para obtener más información sobre la creación de un conjunto de datos, consulta Crea un conjunto de datos.Ejecuta la siguiente declaración para crear una tabla llamada
private_table
enprivate_dataset
:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
Ejecuta la siguiente declaración para crear una UDF llamada
count_key
enpublic_dataset
. La UDF incluye una declaraciónSELECT
enprivate_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));
Otorga la función
bigquery.dataViewer
a un usuario en el conjunto de datospublic_dataset
. Esta función incluye el permisobigquery.routines.get
, que le permite al usuario llamar a la función. Si deseas obtener información para asignar controles de acceso a un conjunto de datos, consulta Controla el acceso a los conjuntos de datos.En este punto, el usuario tiene permiso para llamar a la función
count_key
, pero no puede acceder a la tabla enprivate_dataset
. Si el usuario intenta llamar a la función, 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.
Con la herramienta de línea de comandos de
bq
, ingresa el comandoshow
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
.Edita
dataset.json
para agregar el siguiente objeto JSON al arrayaccess
:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Reemplaza PROJECT_ID por el ID del proyecto para
public_dataset
.Con la herramienta de línea de comandos de
bq
, ingresa el comandoupdate
como se muestra a continuación:bq update --source dataset.json private_dataset
Para verificar que la UDF tenga acceso a
private_dataset
, el usuario puede ejecutar la siguiente consulta:SELECT public_dataset.count_key('key1');