Descripción general de 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 la vista 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 la vista, estas 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 a una vista para los usuarios.

Vistas de los derechos del invocadorVistas de derechos de definidor
Descripción Si creas una vista con derechos de invocador, un rol de base de datos necesita privilegios en la vista y en todos los objetos de esquema a los que hace referencia para consultar la vista. Para obtener más información, consulta Vistas de derechos del invocador. Si creas una vista con derechos de definidor, un rol de base de datos necesita privilegios en la vista (y solo en la vista) para consultarla. Usa el control de acceso detallado junto con la vista de derechos del definidor; de lo contrario, la vista de derechos del definidor no agregará ningún control de acceso adicional. Para obtener más información, consulta Vistas de derechos del definidor.
Permisos necesarios para crear la vista Para crear, otorgar y revocar el acceso a cualquiera de los tipos de vistas, 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 a fin de consultar la vista. Un rol de base de datos necesita privilegios para la vista (y solo la vista) a fin de 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 un modelado de datos lógico a las aplicaciones.

    A veces, las elecciones que tienen sentido en 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.

  • Las vistas centralizan las definiciones de las consultas y simplifican el mantenimiento.

    Cuando creas vistas para consultas complejas o de uso general, puedes factorizar el texto de las consultas de las aplicaciones y centralizarlo. Esto hace que mantener el texto de las consultas actualizado en todas las aplicaciones sea mucho más sencillo y permite la revisión y el ajuste de las consultas sin necesidad de cambiar el código de la aplicación.

  • Las vistas proporcionan estabilidad en todos 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 hace referencia la consulta no se invaliden.

Casos de uso habituales

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

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

Si deseas crear una vista en la que no todos los invocadores tengan acceso a todos los objetos de esquema a los que la vista hace referencia, crea una vista de derechos del definidor. Las vistas de derechos del definidor están mejor protegidas y tienen más restricciones porque el administrador de la base de datos puede proporcionar privilegios a menos usuarios en las tablas y columnas a las que se hace referencia en la vista. Las vistas de derechos de definidor 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 quieras crear una vista de derechos del 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 los 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 definidor

La vista de derechos de un definidor agrega funcionalidad de seguridad adicional a la vista. Proporciona diferentes privilegios en la vista y en los objetos de esquema subyacentes. Al igual que con las vistas de derechos del invocador, los usuarios deben tener permisos a nivel de la base de datos para crear las vistas de derechos del definidor. La diferencia principal es que cuando una función 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í misma (y solo a la vista). Por lo tanto, incluso si el usuario que consulta la vista no tiene acceso a todos los objetos de 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 agregará ningún control de acceso adicional. Esto se debe a que, si el usuario tiene permisos de lectura en la base de datos, 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 con el privilegio SELECT en la vista y los usuarios con permisos a nivel de la 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 las 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.

  • Las referencias a las vistas no 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 Read.

  • Las vistas de derechos de Definer 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 recibirán un error cuando realicen consultas en un modo de consulta que no sea el normal.

  • Es posible que un usuario cree 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 hay la siguiente vista QualityStudentScores que muestra las puntuaciones de los estudiantes que califican 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 los 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 en el 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.

Consulta el rendimiento cuando se usan vistas

Una consulta que hace referencia a una vista se realiza de manera comparable con esa misma consulta, y su referencia de vista se reemplaza 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 muestra 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 esa consulta con los límites de consulta porque 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 que se genera mediante la ejecución de la definición de consulta de una vista no se guarda en el almacenamiento de la base de datos persistente.

¿Qué sigue?