Una vista es una tabla virtual que se construye a partir del resultado de una consulta sobre una o más tablas. No almacena datos reales. Las vistas permiten simplificar consultas complejas y mejorar la seguridad de los datos. En este tema se describe cómo crear una vista mediante la instrucción CREATE VIEW.
Notas de uso
AnalyticDB for MySQL tiene un comportamiento de vistas compatible con el de MySQL, como se detalla a continuación:
-
Versiones anteriores a la 3.1.9.0
Los clústeres de AnalyticDB for MySQL no admiten el comportamiento predeterminado de MySQL. Si agrega o elimina columnas de una vista y luego la consulta con
SELECT * FROM <view_name>;, el comportamiento difiere del de MySQL. El sistema detecta una discrepancia en la cantidad de columnas y determina que la vista no está disponible. En este caso, se devuelve el siguiente error:View '<view_name>' is stale; it must be re-created. -
V3.1.9.0 y posteriores
Los clústeres de AnalyticDB for MySQL son compatibles con el comportamiento predeterminado de MySQL. Al crear una vista, el clúster expande el símbolo
*de la instrucción SQL y lo convierte en columnas explícitas antes de almacenarla. Después de esto, agregar o eliminar columnas ya no afecta a la vista.
Por lo tanto, se recomienda usar un clúster con la versión V3.1.9.0 o posterior para crear vistas. Esto garantiza la compatibilidad con el comportamiento predeterminado de MySQL y evita semánticas inesperadas o errores provocados por el uso de * en las vistas.
Para consultar la versión secundaria de un clúster Data Lakehouse Edition, ejecute SELECT adb_version();. Para actualizar la versión secundaria, póngase en contacto con el soporte técnico.
En los clústeres de AnalyticDB for MySQL con la versión V3.1.9.0 o posterior, compatibles con el comportamiento de MySQL, pueden presentarse efectos secundarios en casos especiales. Por ejemplo, si cambia el nombre de una columna de C a D y la vista necesita hacer referencia exacta a las columnas A, B y C, la vista deja de estar disponible y se devuelve un error porque la columna C ya no existe. Este comportamiento es el esperado. Se devuelve un error incluso si la consulta no utiliza finalmente la columna C, ya que la eliminación de columnas ocurre durante la fase de optimización, mientras que las comprobaciones de sintaxis SQL y la verificación de permisos se ejecutan en la fase de análisis sintáctico. Sin embargo, en versiones anteriores a la 3.1.9.0, todas las comprobaciones pasan sin devolver errores. Esto sucede porque solo se verifica la cantidad de columnas de la vista, la cual permanece igual tras cambiar el nombre, y la cantidad de columnas a las que hace referencia el * actual coincide. Una vez superada la comprobación de disponibilidad de la vista, la columna C se asigna a la tercera columna según el orden de la tabla base. Incluso si consulta la columna C después de cambiarle el nombre, no se devuelve ningún error, pero los resultados de la consulta serán inesperados.
Si su negocio requiere el comportamiento particular de los clústeres de AnalyticDB for MySQL con versiones anteriores a la 3.1.9.0, agregue un hint específico o configure un ajuste al crear las vistas para obtener el comportamiento esperado.
-
Para configurar una sola vista, agregue
/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/. A continuación se muestra un ejemplo de cómo agregar el hint:/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ CREATE VIEW v0 AS SELECT * FROM base0; Para configurar todas las vistas del clúster, ejecute la siguiente instrucción:
SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;
Sintaxis
CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;
|
Parámetro |
Obligatorio |
Descripción |
|
|
No |
Crea una vista aplicando una regla que depende de si ya existe otra vista con el mismo nombre. Las reglas son las siguientes:
Nota
Si no se especifica este parámetro y ya existe una vista con el mismo nombre, la creación de la vista falla. |
|
|
Método de verificación de seguridad que se utiliza al consultar los datos de una vista. Valores válidos:
Nota
|
|
|
|
Sí |
Nombre de la vista. Nota
También puede anteponer el nombre de la base de datos al nombre de la vista para indicar a qué base de datos pertenece, por ejemplo, |
|
|
Origen de datos de la vista. |
Ejemplos
-
Preparar datos de prueba
Use una cuenta con privilegios del clúster de AnalyticDB for MySQL para realizar las siguientes operaciones:
-
Cree una cuenta llamada
user1:CREATE USER user1 IDENTIFIED BY 'user1_pwd'; -
Cree una base de datos llamada
adb_demoy una tabla llamadat1dentro de ella. La siguiente instrucción crea la tablat1:Create Table `t1` ( `id` bigint AUTO_INCREMENT, `id_province` bigint NOT NULL, `user_info` varchar, primary key (`id`) ) DISTRIBUTED BY HASH(`id`);Inserte datos de prueba en la tabla
t1:INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
-
-
Crear vistas
NotaEn los siguientes ejemplos se crean vistas sobre la tabla
t1con distintos métodos de verificación de seguridad. El objetivo es mostrar las diferencias en los permisos entreDEFINEReINVOKER.-
Para crear una vista llamada
v1y establecerSQL SECURITYenINVOKER, ejecute la siguiente instrucción:CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Para crear una vista llamada
v2y establecerSQL SECURITYenDEFINER, ejecute la siguiente instrucción:CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Para crear una vista llamada
v3sin especificarSQL SECURITY(en este caso, el sistema usaINVOKERde forma predeterminada), ejecute la siguiente instrucción:CREATE VIEW v3 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
-
-
Comparar permisos
-
Con una cuenta con privilegios, otorgue a
user1únicamente el permiso para consultar las tres vistas:GRANT SELECT ON adb_demo.v1 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v2 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';En este escenario, cuando
user1se conecta a la base de datosadb_demodel clúster de AnalyticDB for MySQL, solo puede consultar la vistav2. Instrucción de consulta:SELECT * FROM v2;Se devuelve el siguiente resultado:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+Sin embargo, se devuelve un error cuando
user1intenta consultar la vistav1ov3. Instrucción de consulta:SELECT * FROM v1o bien
SELECT * FROM v3Ambas instrucciones devuelven el siguiente error:
ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view -
Después de otorgar a
user1el permiso para consultar las tres vistas, use una cuenta con privilegios para concederle también el permiso de consulta sobre la tablauser1t1:GRANT SELECT ON adb_demo.t1 to user1@'%';Ahora, cuando
user1se conecta a la base de datosuser1adb_demodel clúster de AnalyticDB for MySQL, puede consultar las vistasuser1v1,v2yv3. Instrucción de consulta:SELECT * FROM v1;o bien
SELECT * FROM v2;o bien
SELECT * FROM v3;Las tres instrucciones de consulta devuelven el mismo resultado:
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
-
Preguntas frecuentes
¿Por qué los nombres de columna definidos en minúsculas en una tabla base aparecen en mayúsculas en el conjunto de resultados de la vista?
De forma predeterminada, los nombres de columna del conjunto de resultados de una vista de AnalyticDB for MySQL no distinguen entre mayúsculas y minúsculas. Si desea que aparezcan en minúsculas, establezca el valor de VIEW_OUTPUT_NAME_CASE_SENSITIVE en true para habilitar la distinción. Para ello, ejecute la siguiente instrucción:
SET ADB_CONFIG VIEW_OUTPUT_NAME_CASE_SENSITIVE=true;
Prácticas recomendadas
Para obtener más información, consulte Permission management by using views.