Crea una vista autorizada

BigQuery es un almacén de datos estadísticos a escala de petabytes que puedes usar para ejecutar consultas de SQL en grandes cantidades de datos casi en tiempo real.

En BigQuery, la acción de otorgar acceso parar ver un conjunto de datos también se conoce como crear una vista autorizada. Una vista autorizada te permite compartir resultados de consultas con usuarios y grupos específicos sin darles acceso a las tablas subyacentes. También puedes usar la consulta de SQL de la vista para restringir las columnas (campos) que los usuarios pueden consultar. En este instructivo, crearás una vista autorizada.

Objetivos

En este instructivo podrás hacer lo siguiente:

  • Crear conjuntos de datos y aplicar controles de acceso a ellos
  • Asignar controles de acceso a tu proyecto
  • Crear una vista autorizada que restrinja los datos que los usuarios pueden consultar

Costos

BigQuery es un producto pago que generará costos de uso en este instructivo. BigQuery ofrece algunos recursos de forma gratuita hasta alcanzar un límite específico. Para obtener más información, consulta Operaciones gratuitas de BigQuery y nivel gratuito.

Antes de comenzar

Antes de comenzar con este instructivo, usa Google Cloud Console para crear o seleccionar un proyecto.

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. BigQuery se habilita de forma automática en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a Habilita la API BigQuery.

    Habilita la API

    .
  4. Opcional: Habilita la facturación para el proyecto. Si no deseas habilitar la facturación ni proporcionar una tarjeta de crédito, los pasos que se indican en este documento seguirán funcionando. BigQuery proporciona una zona de pruebas para realizar los pasos.

Introducción

En este instructivo, crearás dos conjuntos de datos: uno para tus datos de origen y otro para tu vista autorizada. Propagarás el conjunto de datos de origen con los datos del conjunto de datos públicos de GitHub. Después, creas una vista que consulta una tabla en el conjunto de datos fuente.

Una vez que crees los conjuntos de datos y la vista, asigna controles de acceso al proyecto, al conjunto de datos que contiene la vista y al conjunto de datos que contiene los datos de origen.

Dar acceso a una vista al conjunto de datos de origen también se conoce como crear una vista autorizada. Cuando creas una vista autorizada, sigue estos pasos:

  • Crea un conjunto de datos separado para almacenar la vista.
  • Crea la vista en el conjunto de datos nuevo
  • Asigna controles de acceso al proyecto.
  • Asigna controles de acceso al conjunto de datos que contiene la vista
  • Autoriza la vista para acceder al conjunto de datos fuente.

Crea un conjunto de datos de origen

Comienza creando un conjunto de datos para almacenar tus datos fuente. Para este instructivo, consulta el conjunto de datos públicos GitHub a fin de propagar una tabla en el conjunto de datos fuente. Los datos en tu conjunto de datos fuente contienen información que no deseas que vean tus análisis de datos. Restringe el acceso a los datos mediante una vista autorizada.

Para crear tu conjunto de datos fuente:

Console

  1. En Cloud Console, abre la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, selecciona el proyecto en el que deseas crear el conjunto de datos.

  3. Expande la opción Acciones y haz clic en Crear conjunto de datos.

  4. En ID del conjunto de datos, ingresa github_source_data.

  5. Usa los valores predeterminados para el resto de la configuración y haz clic en Crear conjunto de datos.

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.

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

Después de crear el conjunto de datos fuente, propaga una tabla con una consulta de SQL. Esto recupera datos de consulta del conjunto de datos públicos de GitHub.

Console

  1. En Cloud Console, abre la página de BigQuery.

    Ir a BigQuery

  2. Haz clic en Redactar consulta nueva.

  3. Copia y pega la siguiente consulta en el área de texto del Editor de consultas.

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. Haz clic en Más y selecciona Configuración de consulta.

  5. En Destino, marca la casilla Establecer una tabla de destino para los resultados de la consulta.

    • En Nombre del proyecto, verifica que tu proyecto esté seleccionado.
    • En Nombre del conjunto de datos, verifica que la opción github_source_data esté seleccionada.
    • En Nombre de la tabla, ingresa github_contributors.
    • Haz clic en Guardar.

  6. Haz clic en Ejecutar.

  7. Cuando se complete la consulta, haz clic en github_contributors y, luego, en Vista previa para verificar que los datos se escribieron en la tabla.

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.

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

Crea un conjunto de datos separado para almacenar tu vista

Después de crear tu conjunto de datos fuente, crearás un conjunto de datos nuevo y separado para almacenar la vista autorizada que compartirás con tus analistas de datos. En un paso posterior, otorgarás acceso de vista autorizado a los datos en el conjunto de datos fuente. Tus analistas de datos tendrán acceso a la vista autorizada, pero no al acceso directo a los datos de origen.

Las vistas autorizadas que tienen acceso controlado a nivel del conjunto de datos deben crearse en un conjunto de datos diferente de los datos de origen para que los propietarios de datos puedan proporcionar acceso a los usuarios a la vista autorizada sin otorgar acceso a los datos subyacentes de forma simultánea. El conjunto de datos de origen y el de vista autorizada deben estar en la misma ubicación regional.

Crea un conjunto de datos para almacenar tu vista:

Console

  1. En Cloud Console, abre la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, selecciona el proyecto en el que deseas crear el conjunto de datos.

  3. Expande la opción Acciones y haz clic en Crear conjunto de datos.

  4. En ID del conjunto de datos, ingresa shared_views.

  5. Usa los valores predeterminados para el resto de la configuración y haz clic en Crear conjunto de datos.

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.

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

Crea la vista en el conjunto de datos nuevo

En el conjunto de datos nuevo, crearás la vista que deseas autorizar. Esta es la vista que compartes con tus analistas de datos. Esta vista se crea mediante una consulta de SQL que excluye las columnas que no deseas que vean los analistas de datos.

Para este instructivo, tu vista compartida excluye toda la información del autor, excepto el nombre del autor, y toda la información del confirmador, excepto el nombre del confirmador.

Para crear la vista en el conjunto de datos nuevo, sigue estos pasos:

Console

  1. En Cloud Console, abre la página de BigQuery.

    Ir a BigQuery

  2. Haz clic en Redactar consulta nueva.

  3. Copia y pega la siguiente consulta en el área de texto del Editor de consultas. Reemplaza project_id por el ID del proyecto.

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. Haz clic en Más y selecciona Configuración de consulta.

  5. En Dialecto de SQL, selecciona Estándar. Haz clic en Guardar para actualizar la configuración de la consulta y volver al Editor de consultas.

  6. En la lista desplegable Guardar en el Editor de consultas, selecciona Guardar vista.

  7. En el cuadro de diálogo Guardar vista, realiza los siguientes pasos:

    • En Nombre del proyecto, verifica que tu proyecto esté seleccionado.
    • En Nombre del conjunto de datos, verifica que la opción shared_views esté seleccionada.
    • En Nombre de la tabla, ingresa github_analyst_view.
    • Haz clic en Guardar.

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.

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

Asigna una función de IAM a nivel de proyecto a tus analistas de datos

A fin de consultar la vista, los analistas de datos necesitan permiso para ejecutar trabajos de consulta. La función bigquery.user incluye permisos para ejecutar trabajos, incluidos los trabajos de consulta, dentro del proyecto. Si otorgas a un usuario o grupo la función bigquery.user a nivel del proyecto, el usuario puede crear conjuntos de datos y ejecutar trabajos de consulta en las tablas de esos conjuntos de datos. La función bigquery.user no otorga permiso a los usuarios para consultar datos, ver datos de tabla o ver detalles de esquema de tabla en los conjuntos de datos que el usuario no creó.

Si asignas la función bigquery.user a nivel del proyecto a tus analistas de datos, no se les permitirá ver o consultar datos de tabla en el conjunto de datos que contiene las tablas que consulta la vista. La función bigquery.user tampoco otorga a los usuarios la capacidad de actualizar tus vistas. Se debe asignar la función bigquery.user a nivel del proyecto a la mayoría de los individuos (científicos de datos, analistas de inteligencia empresarial, analistas de datos) de una empresa.

Cuando agregas un grupo a una función de IAM, la dirección de correo electrónico y el dominio deben estar asociados con una Cuenta de Google activa o una cuenta de Google Apps.

Para asignar la función bigquery.user a nivel del proyecto al grupo de analistas de datos, sigue estos pasos:

Console

  1. Abre la página de IAM en Google Cloud Console.

    Abrir la página IAM

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona tu proyecto y haz clic en Abrir.

  4. En la página IAM, haz clic en Agregar.

  5. En el cuadro de diálogo Agregar miembros, realiza los siguientes pasos:

    • En el cuadro Miembros, ingresa el grupo que contiene a tus analistas de datos (por ejemplo, data_analysts@example.com).
    • En el cuadro Seleccionar una función, busca la función Usuario de BigQuery y selecciónala.
    • Haz clic en Guardar.

Asigna controles de acceso al conjunto de datos que contiene la vista

Para que los analistas de datos consulten la vista, se les debe otorgar la función bigquery.dataViewer en el conjunto de datos que contiene la vista. La función bigquery.user otorga a los analistas de datos los permisos necesarios para crear trabajos de consulta. Sin embargo, no pueden consultar la vista de forma correcta, salvo que tengan acceso bigquery.dataViewer al conjunto de datos que contiene la vista.

Para otorgar a los analistas de datos el acceso bigquery.dataViewer al conjunto de datos, sigue estos pasos:

Console

  1. En el panel Explorador, selecciona el conjunto de datos shared_views.

  2. Expande la opción Acciones y haz clic en Abrir.

  3. Haz clic en Compartir conjunto de datos.

  4. En el cuadro de texto Nuevos miembros, ingresa el grupo que contiene los analistas de datos (por ejemplo, data_analysts@example.com).

  5. Haz clic en Seleccionar una función y selecciona BigQuery > Visualizador de datos de BigQuery.

  6. Haga clic en Add.

  7. Haga clic en Listo.

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.

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

Autoriza la vista para acceder al conjunto de datos fuente

Una vez que crees los controles de acceso para el conjunto de datos que contiene la vista, agrega la vista como una vista autorizada en el conjunto de datos fuente. Esto le da a la vista acceso a los datos fuente, no a tu grupo de analistas de datos.

Para autorizar la vista a fin de acceder a los datos de origen, sigue estos pasos:

Console

  1. En el panel Explorador, selecciona el conjunto de datos github_source_data.

  2. Expande la opción Acciones y haz clic en Abrir.

  3. Haz clic en Compartir conjunto de datos.

  4. En el panel Permisos del conjunto de datos, selecciona la pestaña Vistas autorizadas.

  5. En Compartir vista autorizada, realiza los siguientes pasos:

    • En Seleccionar proyecto, verifica que tu proyecto esté seleccionado.
    • En Seleccionar conjunto de datos, elige shared_views.
    • En Seleccionar vista, ingresa el nombre de la vista: github_analyst_view.
    • Haga clic en Add.

  6. Haga clic en Listo.

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.

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

Verifica la configuración

Cuando se completa la configuración, un miembro de tu grupo de analistas de datos (por ejemplo, data_analysts) puede realizar una consulta en la vista para verificar la configuración.

Para verificar la configuración, sigue estos pasos:

Console

  1. Haz que un miembro de tu grupo de analistas de datos vaya a la página de BigQuery en Cloud Console.

    Ir a BigQuery

  2. Haz clic en Redactar consulta nueva.

  3. Copia y pega la siguiente consulta en el área de texto del Editor de consultas. Reemplaza project_id por el ID del proyecto.

    SELECT
      *
    FROM
      `project_id.shared_views.github_analyst_view`
    

Código fuente completo

Aquí se muestra el código fuente completo del instructivo a modo de referencia.

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.

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

Antes de probar esta muestra, 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?