Información general sobre las vistas

En este documento se presentan y describen las vistas de Spanner.

Información general

Una vista es una tabla virtual definida mediante una consulta de SQL. Cuando creas una vista, especificas la consulta de SQL que representa. Una vez que hayas creado una vista, podrás 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 ejecutando la consulta definida en la vista. La consulta de referencia usa el contenido de esa tabla virtual.

Como la consulta que define una vista se ejecuta cada vez que se ejecuta una consulta que hace referencia a la vista, 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 vista con derechos del invocador o como vista con derechos del definidor. Estos son los dos tipos de modelos de seguridad que controlan el acceso de los usuarios a una vista.

Vistas de derechos del invocadorVistas de derechos del definidor
Descripción Si crea una vista con derechos del invocador, un rol 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 crea una vista con derechos del definidor, un rol de base de datos necesita privilegios en la vista (y solo en la vista) para consultar la vista. Usa el control de acceso pormenorizado junto con la vista de derechos del definidor. De lo contrario, esta vista no añadirá 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, conceder y revocar el acceso a cualquiera de los dos tipos de vistas, debes tener el permiso spanner.database.updateDdl a nivel de 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 consultar la vista.

Ventajas de las visualizaciones

Las vistas ofrecen varias ventajas con respecto a la inclusión de las consultas que definen en la lógica de la aplicación.

  • Las vistas pueden proporcionar modelado lógico de datos a las aplicaciones.

    A veces, las opciones 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.

  • Las vistas centralizan las definiciones de las consultas y, por lo tanto, simplifican el mantenimiento.

    Si crea vistas para consultas complejas o que se usan con frecuencia, puede extraer el texto de las consultas de las aplicaciones y centralizarlo. De esta forma, es mucho más sencillo mantener el texto de las consultas actualizado en todas las aplicaciones y se pueden revisar y ajustar las consultas sin tener que cambiar el código de las aplicaciones.

  • Las vistas proporcionan estabilidad en los cambios de esquema.

    Como 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 asegurarse de que los cambios de esquema en los objetos (tablas, columnas, etc.) a los que hace referencia la consulta no la invaliden.

Casos prácticos habituales

Usa vistas cuando tu base de datos de Spanner incluya datos con privilegios elevados que no deban exponerse a todos los usuarios de la base de datos o si quieres encapsular tus datos.

Si tu vista no necesita funciones de seguridad adicionales 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 con derechos de invocador.

Si quieres 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 con derechos de definidor. Las vistas de derechos de 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 del 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, puede crear una vista con derechos de definidor para los siguientes datos:

  • Datos de cuentas personales (por ejemplo, clientes de aplicaciones).
  • Datos específicos de cada rol (por ejemplo, Personal de RR. HH., comercial).
  • Datos específicos de la ubicación.

Vistas de derechos del invocador

Si una vista tiene derechos del invocador, significa que, cuando un usuario (el invocador) ejecuta una consulta en la vista, Spanner comprueba 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 del definidor

Una vista de derechos de definidor añade funciones de seguridad adicionales a la vista. Proporciona diferentes privilegios en la vista y en los objetos de esquema subyacentes. Al igual que con las vistas con derechos del invocador, los usuarios deben tener permisos a nivel de base de datos para crear vistas con derechos del definidor. La principal diferencia es que, cuando un rol de base de datos consulta una vista de derechos de definidor, Spanner verifica que el rol tenga acceso a la vista en sí (y solo a la vista). Por lo tanto, aunque el usuario que consulta la vista no tenga acceso a todos los objetos de esquema subyacentes, puede acceder a la vista y ver su contenido. Las vistas con derechos de definidor dan a los usuarios acceso a datos actualizados, limitados a las filas definidas en la vista.

Los permisos de gestión de identidades y accesos (IAM) de Spanner se conceden a nivel de base de datos. Usa el control de acceso pormenorizado junto con la vista de derechos del definidor. De lo contrario, esta vista no añadirá 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 los tiene en todos los objetos de esquema de la base de datos. Después de configurar el control de acceso pormenorizado en tu base de datos, los usuarios con control de acceso pormenorizado que tengan el privilegio SELECT en la vista y los usuarios con permisos a nivel de base de datos en la base de datos podrán consultar la vista. La diferencia es que el usuario con control de acceso pormenorizado 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 inadecuadas para determinados casos prácticos.

  • Las vistas son de solo lectura. No se pueden usar para añadir, actualizar ni eliminar datos.

    No se pueden usar vistas en instrucciones 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 vistas no pueden usar sugerencias de tabla.

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

  • La API Read no admite vistas.

  • Las vistas de derechos de definidor no se admiten en Data Boost de Spanner.

    Si ejecutas una consulta que contiene una vista de derechos de definidor en Data Boost, se produce 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 una vista con derechos de definidor reciben un error cuando hacen consultas en un modo de consulta que no es el normal.

  • Es posible que un usuario cree una consulta cuidadosamente diseñada que provoque que Spanner genere 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 existe la siguiente vista QualifiedStudentScores, que devuelve las puntuaciones de los alumnos que cumplen los requisitos de un curso. Los criterios para cumplir los requisitos se basan en el nivel y la puntuación del examen del alumno. Si el nivel del alumno es igual o inferior a seis, la puntuación es importante y el alumno debe obtener al menos 50 puntos en el examen para aprobar. De lo contrario, si el nivel es igual o superior a seis, el alumno cumple los requisitos 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 con el siguiente formato: 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 alumno de nivel 7 que ha obtenido 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 al usar vistas

Una consulta que hace referencia a una vista tiene un rendimiento comparable al de la misma consulta con la referencia a la vista sustituida 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 indican las cuotas y los límites específicos de las vistas.

  • Usar una vista en una consulta puede afectar al cumplimiento de los límites de consulta, ya que la definición de la vista pasa a formar parte de la consulta.

Impacto en los costes

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

  • El uso de vistas no influye en las necesidades de capacidad de cálculo de una instancia, en comparación con la inserció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, ya que la tabla generada al ejecutar la definición de consulta de una vista no se guarda en el almacenamiento persistente de la base de datos.

Siguientes pasos