En este documento, 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 creaste 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 ejecutando la consulta definida en la vista, y la consulta que hace referencia usa el contenido de esa tabla virtual.
Dado que la consulta que define una vista se ejecuta cada vez que se ejecuta una consulta que hace referencia a la vista, a veces se las denomina 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 a una vista.
Vistas de derechos del invocador | Vistas de los derechos del definidor | |
---|---|---|
Descripción | Si creas 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 consultarla. Para obtener más información, consulta Vistas de derechos del invocador. | Si creas una vista con derechos del 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, esta vista 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 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 la inclusión de 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 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 consultas y, por lo tanto, simplifican el mantenimiento.
Si creas vistas para consultas complejas o de uso frecuente, puedes factorizar el texto de las consultas fuera de las aplicaciones y centralizarlo. Esto simplifica mucho la tarea de mantener actualizado el texto de las búsquedas en todas las aplicaciones y permite revisar y ajustar las búsquedas sin necesidad de cambiar 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 y se asegura de que los cambios que el esquema haga a los objetos (tablas, columnas, etc.) a los que la consulta hace referencia, no invaliden la consulta.
Casos de uso habituales
Usa vistas cuando tu base de datos de Spanner incluya datos altamente privilegiados 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 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 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 hace referencia la vista, 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 otorgar 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 manera segura a un subconjunto pertinente de una base de datos de Spanner. Por ejemplo, es posible que desees crear una vista de derechos del definidor para los siguientes datos:
- Datos personales de la cuenta (p. ej., cliente de la aplicación)
- Datos específicos del rol (p.ej., personal de RR.HH., asistente de ventas).
- Son 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 verifica los privilegios del usuario en la vista y en todos los objetos del esquema a los que hace referencia la vista. El usuario debe tener privilegios en todos los objetos del esquema para consultar la vista.
Vistas de los derechos del definidor
La vista de derechos del definidor agrega funcionalidad de seguridad adicional a la vista. Proporciona diferentes privilegios en la vista y 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 vistas de derechos del definidor. La principal diferencia es que, cuando un rol de base de datos consulta una vista de derechos del definidor, Spanner verifica que el rol 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 subyacente, puede acceder a la vista y ver su contenido. Las vistas de derechos del definidor brindan a los usuarios acceso a datos actualizados, 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, esta vista 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, también los tendrá 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 control de acceso detallado que tengan el privilegio SELECT
en la vista y los usuarios con permisos a nivel de la base de datos pueden consultar la vista. La diferencia es que el usuario del control de acceso detallado no necesita privilegios sobre los objetos subyacentes.
Limitaciones de las vistas
Las vistas tienen limitaciones en comparación con las tablas reales, lo que las hace inadecuadas 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.
No se pueden indexar las vistas.
Las referencias a vistas no pueden usar sugerencias de tablas.
Sin embargo, la consulta que define una vista puede incluir sugerencias de tabla en las tablas a las que hace referencia.
La API de Read no admite vistas.
Las vistas de derechos del definidor no son compatibles con Data Boost de Spanner.
Ejecutar una consulta que contenga una vista de derechos del definidor en los resultados de Data Boost genera 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 de derechos del definidor reciben un error cuando realizan consultas en un modo de consulta que no es normal.
Es posible que un usuario cree una consulta cuidadosamente diseñada que provoque 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 existe la siguiente vista QualifiedStudentScores, que devuelve las puntuaciones de los estudiantes que cumplen con los requisitos para un curso. Los criterios para calificar se basan en el nivel y la puntuació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 el formato
SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1;
. Esta consulta podría 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 se ejecuta de manera comparable a la misma consulta con la definición de la vista en lugar de la referencia a la vista.
Cuotas y límites que se aplican a las vistas
En la página Cuotas y límites, se muestra información sobre las cuotas y los límites específicamente para las vistas.
Usar una vista en una consulta puede afectar el cumplimiento de esa consulta con los límites de consultas, ya que la definición de la vista pasa a formar 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 de su 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 que se genera al ejecutar la definición de la consulta de una vista no se guarda en el almacenamiento persistente de la base de datos.
¿Qué sigue?
- Obtén más información para crear y administrar vistas.