Descripción general de las vistas

En este tema, se presentan y describen las vistas de Spanner.

Descripción general

Una vista es una tabla virtual definida por una consulta en SQL. Cuando creas una vista, especificas la consulta en SQL que representa. Una vez que hayas creado una vista, puedes ejecutar consultas que hagan referencia a ella como si fuera una tabla.

Cuando se ejecuta una consulta que hace referencia a una vista, Spanner crea la tabla virtual mediante la ejecución de la consulta definida en la vista, y la consulta de referencia usa el contenido de esa tabla virtual.

Debido a que la consulta que define una vista se ejecuta cada vez que se ejecuta una consulta que hace referencia a ella, las vistas a veces se denominan vistas lógicas o vistas dinámicas para distinguirlas de las vistas materializadas de SQL, que almacenan los resultados de la consulta que define la vista como una tabla real en el almacenamiento de datos.

En Spanner, puedes crear una vista como una vista de derechos del invocador o una vista de derechos del definidor. Son los dos tipos de modelos de seguridad que controlan el acceso de los usuarios.

Vistas de derechos del invocadorVistas de derechos de definer
Descripción Si creas una vista con derechos de invocador, una función de base de datos necesita privilegios en la vista y en todos los objetos de esquema a los que hace referencia la vista para consultar la vista. Para obtener más información, consulta Vistas de derechos del invocador. Si creas una vista con los derechos del definidor, un rol de base de datos necesita privilegios en la vista (y solo en la vista) para consultarla. Usa un control de acceso detallado junto con la vista de derechos del definidor; de lo contrario, la vista de derechos del definidor no agrega ningún control de acceso adicional. Para obtener más información, consulta Vistas de derechos de Definer.
Permisos necesarios para crear la vista Para crear, otorgar y revocar el acceso a cualquiera de los tipos de vista, debes tener el permiso spanner.database.updateDdl a nivel de la base de datos.
Privilegios necesarios para consultar la vista Un rol de base de datos necesita privilegios para la vista y todos sus objetos de esquema subyacentes para consultar la vista. Un rol de base de datos necesita privilegios para la vista (y solo para la vista) para consultarla.

Beneficios de las vistas

Las vistas ofrecen varios beneficios en comparación con incluir las consultas que definen en la lógica de la aplicación.

  • Las vistas pueden proporcionar modelos de datos lógicos a las aplicaciones.

    A veces, las elecciones que tienen sentido para el modelado de datos físicos en Spanner no son la mejor abstracción para las aplicaciones que leen esos datos. Una vista puede presentar un esquema de tabla alternativo que sea una abstracción más adecuada para las aplicaciones.

  • Visualiza las definiciones de consultas centralizadas y simplifican el mantenimiento.

    Cuando creas vistas para consultas complejas o muy usadas, puedes factorizar el texto de consulta de las aplicaciones y centralizarlo. Esto hace que mantener el texto de la consulta actualizado en todas las aplicaciones sea mucho más simple y permite revisar y ajustar las consultas sin necesidad de que cambie el código de la aplicación.

  • Las vistas proporcionan estabilidad en los cambios de esquema.

    Debido a que la consulta que define una vista se almacena en el esquema de la base de datos en lugar de en la lógica de la aplicación, Spanner puede garantizar que los cambios de esquema en los objetos (tablas, columnas, etc.) a los que se refiere la consulta no invaliden la consulta.

Casos de uso habituales

Usa vistas cuando tu base de datos de Spanner incluya datos con una gran cantidad de privilegios que no deberían exponerse a todos los usuarios de la base de datos o si deseas encapsular tus datos.

Si tu vista no necesita una funcionalidad de seguridad adicional y todos los invocadores de la vista tienen acceso a todos los objetos de esquema a los que hace referencia la vista, crea una vista de derechos de invocador.

Si deseas crear una vista en la que no todos los invocadores tengan acceso a todos los objetos de esquema a los que hace referencia la vista, crea una vista de derechos de un definidor. Las vistas de derechos de definer están mejor protegidas y tienen más restricciones porque el administrador de la base de datos puede proporcionar menos privilegios a los usuarios en las tablas y columnas a las que se hace referencia en la vista. Las vistas de derechos de Definer son útiles cuando un usuario necesita una forma de acceder de forma segura a un subconjunto relevante de una base de datos de Spanner. Por ejemplo, es posible que desees crear una vista de derechos de un definidor para los siguientes datos:

  • Datos de cuentas personales (p. ej., clientes de aplicaciones)
  • Datos específicos del rol (p.ej., personal de RR.HH., asociado de ventas).
  • Datos específicos de la ubicación.

Vistas de derechos del invocador

Si una vista tiene derechos de invocador, significa que cuando un usuario, el invocador, ejecuta una consulta en la vista, Spanner verifica los privilegios del usuario en la vista y en todos los objetos de esquema a los que hace referencia la vista. El usuario debe tener privilegios en todos los objetos de esquema para consultar la vista.

Vistas de derechos de definer

La vista de derechos de un definidor agrega funcionalidad de seguridad adicional a la vista. Proporciona diferentes privilegios en la vista y los objetos del esquema subyacentes. Al igual que ocurre con las vistas de derechos del invocador, los usuarios deben tener permisos a nivel de la base de datos para crear vistas de derechos del definidor. La diferencia principal es que cuando un rol de base de datos consulta la vista de derechos de un definidor, Spanner verifica que la función tenga acceso a la vista en sí (y solo a la vista). Por lo tanto, incluso si el usuario que consulta la vista no tiene acceso a todos los objetos del esquema subyacentes, puede acceder a la vista y ver su contenido. Las vistas de derechos de Definer brindan a los usuarios acceso a datos recientes, limitados a las filas definidas en la vista.

Los permisos de Identity and Access Management (IAM) de Spanner se otorgan a nivel de la base de datos. Usa el control de acceso detallado junto con la vista de derechos del definidor. De lo contrario, la vista de derechos del definidor no agrega ningún control de acceso adicional. Esto se debe a que, si el usuario tiene permisos de lectura en la base de datos, también tiene permisos de lectura en todos los objetos de esquema de la base de datos. Después de configurar el control de acceso detallado en tu base de datos, los usuarios de este tipo con el privilegio SELECT en la vista y los usuarios con permisos a nivel de base de datos en la base de datos pueden consultar la vista. La diferencia es que el usuario de control de acceso detallado no necesita privilegios en los objetos subyacentes.

Limitaciones de las vistas

Las vistas tienen limitaciones en comparación con tablas reales que las hacen inapropiadas para ciertos casos de uso.

  • Las vistas son de solo lectura. No se pueden usar para agregar, actualizar ni borrar datos.

    No puedes usar vistas en declaraciones DML (INSERT, UPDATE, DELETE).

  • La consulta que define una vista no puede usar parámetros de consulta.

  • Las vistas no se pueden indexar.

  • En las referencias a vistas, no se pueden usar sugerencias de tablas.

    Sin embargo, la consulta que define una vista puede incluir sugerencias de tablas en las tablas a las que hace referencia.

  • Las vistas no son compatibles con la API de lectura.

  • Las vistas de derechos del definidor no son compatibles con Data Boost de Spanner.

    Ejecutar una consulta que contenga la vista de derechos de un definidor en Data Boost generará un error.

  • El modo de consulta recomendado para acceder a la vista de derechos de un definidor es el modo NORMAL.

    Los usuarios que no tienen acceso a los objetos de esquema subyacentes de la vista de derechos de un definidor reciben un error cuando realizan una consulta en un modo de consulta diferente del normal.

  • Un usuario puede crear una consulta elaborada con cuidado que haga que Spanner arroje un error que muestre o revele la existencia de datos que no están disponibles en la vista de derechos del definidor.

    Por ejemplo, supongamos que está la siguiente vista QualifiedStudentScores que muestra las puntuaciones de los estudiantes que reúnen los requisitos para un curso. Los criterios de calificación se basan en el nivel y la calificación del examen del estudiante. Si el nivel del estudiante es igual o inferior a seis, la puntuación es importante y el estudiante debe obtener al menos 50 puntos en el examen para calificar. De lo contrario, para niveles iguales o superiores a seis, el estudiante califica de forma predeterminada.

      CREATE VIEW QualifiedStudentScores
      SQL SECURITY DEFINER AS
      SELECT
        s.Name,
        s.Level,
        sc.Score
      FROM Students AS s
      JOIN Scores AS sc ON sc.StudentId = s.StudentId
      WHERE
      (CASE
        WHEN (s.Level < 6) OR (s.Level >= 6 AND sc.Score >= 50)
          THEN 'QUALIFIED';
        ELSE 'FAILED';
      END) = 'QUALIFIED';
    

    Un usuario puede ejecutar una consulta en forma de SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1;. Esta consulta puede fallar con un error de división por cero si hay un estudiante de nivel 7 que obtuvo una puntuación de 20 puntos, aunque la vista limite los datos a 50 puntos o más para ese nivel.

Rendimiento de las consultas cuando se usan vistas

Una consulta que hace referencia a una vista realiza comparaciones con esa misma consulta con su referencia de vista reemplazada por la definición de la vista.

Cuotas y límites que se aplican a las vistas

  • En la página Cuotas y límites, se enumera la información sobre cuotas y límites específicamente para las vistas.

  • El uso de una vista en una consulta puede afectar el cumplimiento de esta con los límites de consulta, ya que la definición de la vista se vuelve parte de la consulta.

Impacto en los costos

El uso de vistas tiene un impacto muy pequeño en el costo de una instancia:

  • El uso de vistas no tiene ningún impacto en las necesidades de capacidad de procesamiento de una instancia, en comparación con la incorporación del texto de consulta definido en las consultas que hacen referencia a ellas.

  • El uso de vistas tiene un impacto muy pequeño en el almacenamiento de la base de datos de una instancia porque la tabla generada mediante la ejecución de la definición de consulta de una vista no se guarda en el almacenamiento persistente de la base de datos.

¿Qué sigue?