Vistas autorizadas y vistas materializadas
En este documento, se describe cómo crear vistas autorizadas y vistas materializadas en BigQuery.
Las vistas autorizadas y las vistas materializadas autorizadas te permiten compartir resultados de consultas con usuarios y grupos específicos sin darles acceso a los datos de origen subyacentes. Se otorga acceso a los datos a la vista o la vista materializada, en lugar de al usuario. También puedes usar la consulta en SQL que crea la vista o la vista materializada para restringir las columnas y los campos que los usuarios pueden consultar.
Cuando realizas una vista autorizada o una vista materializada en otro conjunto de datos, el conjunto de datos de origen y el de la vista autorizada deben estar en la misma ubicación regional.
Si deseas obtener información para autorizar todas las vistas de un conjunto de datos, en lugar de autorizar vistas individuales, consulta Conjuntos de datos autorizados.
Antes de comenzar
Otorga funciones de Identity and Access Management (IAM) que les brindan a los usuarios los permisos necesarios para realizar cada tarea de este documento.
Permisos necesarios
Para crear o actualizar una vista autorizada, necesitas permisos en el conjunto de datos que contiene la vista y en el conjunto de datos que proporciona acceso a la vista.
Permisos del conjunto de datos que contiene la vista
Las vistas se tratan como recursos de tabla en BigQuery, por lo que la creación de una vista requiere los mismos permisos que la creación de una tabla. También debes tener permisos para consultar las tablas a las que hace referencia la consulta en SQL de la vista.
Para crear una vista, necesitas el permiso bigquery.tables.create
de IAM. El rol predefinido de IAM roles/bigquery.dataEditor
incluye los permisos que necesitas para crear una configuración.
Además, si tienes el permiso bigquery.datasets.create
, puedes crear vistas en los conjuntos de datos que crees. Si deseas crear una vista para datos que no son de tu propiedad, debes tener el permiso bigquery.tables.getData
para esa tabla.
Para obtener más información sobre los roles y los permisos de IAM en BigQuery, consulta Roles y permisos predefinidos.
Permisos del conjunto de datos que otorga acceso a la vista
Para actualizar las propiedades del conjunto de datos, necesitas los siguientes permisos de IAM:
bigquery.datasets.update
bigquery.datasets.setIamPolicy
(solo es necesaria cuando se actualizan los controles de acceso del conjunto de datos en la consola de Google Cloud)
El rol predefinido de IAM roles/bigquery.dataOwner
incluye los permisos que necesitas para actualizar las propiedades de un conjunto de datos.
Además, si tienes el permiso bigquery.datasets.create
, puedes actualizar las etiquetas de los conjuntos de datos que crees.
Para obtener más información sobre los roles y los permisos de IAM en BigQuery, consulta Funciones y permisos predefinidos.
Autoriza una vista
Para otorgar acceso de lectura a un conjunto de datos, sigue estos pasos:
Console
Ve a la página de BigQuery en la consola de Google Cloud.
En el panel Explorador, expande tu proyecto y elige un conjunto de datos.
Haz clic en
Ver acciones y, luego, en Abrir.En el panel Información del conjunto de datos, haz clic en
Compartir y, luego, selecciona Autorizar vistas.En Autorizar vistas, escribe el nombre de la vista que quieras autorizar.
Haz clic en Agregar autorización.
Haz clic en Cerrar.
bq
Escribe la información del conjunto de datos existente (incluidos los controles de acceso) en un archivo JSON mediante el comando
bq show
. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato:project_id:dataset
.bq show \ --format=prettyjson \ project_id:dataset > path_to_file
Donde:
- project_id es el ID del proyecto.
- dataset es el nombre del conjunto de datos.
- path_to_file es la ruta al archivo JSON en tu máquina local.
Ejemplos:
Ingresa el siguiente comando para escribir los controles de acceso de
mydataset
en un archivo JSON.mydataset
está en tu proyecto predeterminado.bq show --format=prettyjson mydataset > /tmp/mydataset.json
Ingresa el siguiente comando para escribir los controles de acceso de
mydataset
en un archivo JSON.mydataset
está enmyotherproject
.bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
Agrega la vista autorizada a la sección "acceso" del archivo JSON.
Por ejemplo, la sección de acceso del archivo JSON de un conjunto de datos se vería de la siguiente manera:
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" } { "role": "READER", "specialGroup": "allAuthenticatedUsers" } { "role": "READER", "domain": "[DOMAIN_NAME]" } { "role": "WRITER", "userByEmail": "[USER_EMAIL]" } { "role": "READER", "groupByEmail": "[GROUP_EMAIL]" }, { "view":{ "datasetId": "[DATASET_NAME]", "projectId": "[PROJECT_NAME]", "tableId": "[VIEW_NAME]" } } ], }
Cuando tus ediciones estén completas, usa el comando
bq update
con la marca--source
para incluir el archivo JSON. Si el conjunto de datos está en un proyecto que no es tu proyecto predeterminado, agrega el ID del proyecto al nombre del conjunto de datos en el siguiente formato:project_id:dataset
.bq update \ --source path_to_file \ project_id:dataset
Donde:
- path_to_file es la ruta al archivo JSON en tu máquina local.
- project_id es el ID del proyecto.
- dataset es el nombre del conjunto de datos.
Ejemplos:
Ingresa el siguiente comando a fin de actualizar los controles de acceso para
mydataset
.mydataset
está en tu proyecto predeterminado.bq update --source /tmp/mydataset.json mydataset
Ingresa el siguiente comando a fin de actualizar los controles de acceso para
mydataset
.mydataset
está enmyotherproject
.bq update --source /tmp/mydataset.json myotherproject:mydataset
Para verificar los cambios del control de acceso, ingresa otra vez el comando
show
sin escribir la información en un archivo.bq show --format=prettyjson [DATASET]
o
bq show --format=prettyjson [PROJECT_ID]:[DATASET]
API
Llama a datasets.patch
y usa la propiedad access
para actualizar tus controles de acceso. Para obtener más información, consulta Conjuntos de datos.
Debido a que el método datasets.update
reemplaza todo el recurso de conjunto de datos, es preferible usar el método datasets.patch
para actualizar los controles de acceso.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Quita la autorización a una vista
Para quitar la autorización de una vista, haz lo siguiente:
Consola
Ve a la página de BigQuery en la consola de Google Cloud.
En el panel Explorador, expande tu proyecto y elige un conjunto de datos.
Haz clic en > Autorizar vistas.
CompartirHaz clic en
Quitar autorización.Haz clic en Cerrar.
Cuotas y límites
- Las vistas 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.
- Si quitas una vista autorizada, pueden pasar hasta 24 horas para que se quiten del sistema todas las referencias a la vista. Para evitar errores, espera 24 horas antes de reutilizar el nombre de una vista que se quitó o crea un nombre único para tu vista.
Aplica accesos a nivel de fila con una vista
Las vistas se pueden usar para restringir el acceso a columnas específicas (campos). Si deseas restringir el acceso a las filas individuales en tu tabla, no necesitas crear vistas por separado para cada usuario o grupo. En su lugar, puedes usar la función SESSION_USER()
para mostrar la dirección de correo electrónico del usuario actual.
A fin de mostrar filas diferentes a distintos usuarios, agrega otro campo a la tabla que contiene el usuario que tiene permiso para ver la fila. Luego, crea una vista que use la función SESSION_USER()
. En el siguiente ejemplo, los nombres de usuario se almacenan en el campo allowed_viewer
:
SELECT COLUMN_1, COLUMN_2 FROM `dataset.view` WHERE allowed_viewer = SESSION_USER()
La limitación de este método es que puedes otorgar acceso a un solo usuario a la vez. Puedes evitar esta limitación si haces que allowed_viewer
sea un campo repetido. Este enfoque te permite proporcionar una lista de usuarios para cada fila.
Pero incluso si usas un campo repetido, almacenar los nombres de usuario en la tabla requerirá que realices el seguimiento manual de los usuarios individuales que tienen acceso a cada fila.
En su lugar, propaga el campo allowed_viewer
con nombres de grupos y crea una tabla aparte que asigne los grupos a los usuarios. La tabla que asigna los grupos a los usuarios tendría un esquema que almacene los nombres de grupos y de usuarios. Por ejemplo: {group:string, user_name:string}
Este método te permite administrar la información del usuario y del grupo por separado desde la tabla que contiene los datos.
Si la tabla de asignación se llama private.access_control
, la consulta de SQL que se usa para crear la vista autorizada sería como la que se ve a continuación:
SELECT c.customer, c.id FROM `private.customers` c INNER JOIN ( SELECT group FROM `private.access_control` WHERE SESSION_USER() = user_name) g ON c.allowed_group = g.group
¿Qué sigue?
- Si deseas obtener un instructivo sobre cómo crear una vista autorizada, consulta Crea una vista autorizada.
- Para obtener información sobre cómo crear vistas, consulta Crea vistas.
- Para obtener información sobre cómo crear vistas materializadas, consulta Crea vistas materializadas.
- Para conocer el método sobre cómo obtener metadatos de vistas, consulta Obtén información sobre las vistas.
- Para obtener más información sobre cómo administrar vistas, consulta Administra vistas.
- Para obtener información sobre la autorización de todas las vistas de un conjunto de datos, consulta Conjuntos de datos autorizados.