Todos los productos
Search
Centro de documentos

:CREATE VIEW

Última actualización: Sep 17, 2026

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.

Nota

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

OR REPLACE

No

Crea una vista aplicando una regla que depende de si ya existe otra vista con el mismo nombre. Las reglas son las siguientes:

  • Si no existe ninguna vista con el mismo nombre, AnalyticDB for MySQL crea directamente una vista nueva.

  • Si ya existe una vista con el mismo nombre, AnalyticDB for MySQL elimina la vista existente y luego crea una nueva.

Nota

Si no se especifica este parámetro y ya existe una vista con el mismo nombre, la creación de la vista falla.

[SQL SECURITY]

Método de verificación de seguridad que se utiliza al consultar los datos de una vista. Valores válidos:

  • INVOKER: ejecuta las instrucciones SQL de consulta como el INVOKER (quien realiza la llamada).

    Con este método de verificación de seguridad, el sistema comprueba si quien realiza la llamada cuenta con los siguientes permisos al consultar los datos de la vista:

    • El permiso de consulta sobre la vista.

    • El permiso de consulta sobre los objetos a los que hace referencia la vista.

    Los datos de la vista solo se pueden consultar si quien realiza la llamada tiene ambos permisos.

  • DEFINER: ejecuta las instrucciones SQL de consulta como el DEFINER (quien definió la vista).

    Con este método de verificación de seguridad, el sistema comprueba si quien realiza la llamada y quien definió la vista cuentan con los siguientes permisos al consultar los datos:

    • Quien realiza la llamada debe tener el permiso de consulta sobre la vista.

    • Quien definió la vista debe tener el permiso de consulta sobre los objetos a los que esta hace referencia.

    Si se revocan los permisos de quien definió la vista, esta ya no se puede consultar, incluso si quien realiza la llamada conserva el permiso correspondiente.

Nota
  • Si no se especifica este parámetro, AnalyticDB for MySQL utiliza de forma predeterminada el método de verificación de seguridad INVOKER. En este caso, quien realiza la llamada debe tener tanto el permiso de consulta sobre la vista como el permiso de consulta sobre los objetos a los que esta hace referencia.

  • Este parámetro solo es compatible con los clústeres de AnalyticDB for MySQL que ejecutan la versión V3.1.4.0 o posterior. Para consultar la versión secundaria de un clúster, consulte 如何查看实例版本信息. Para actualizar la versión secundaria, póngase en contacto con el soporte técnico.

view_name

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, adb_demo.view. Si no incluye el nombre de la base de datos, la vista pertenecerá de forma predeterminada a la base de datos actual.

select_statement

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:

    1. Cree una cuenta llamada user1:

      CREATE USER user1 IDENTIFIED BY 'user1_pwd';
    2. Cree una base de datos llamada adb_demo y una tabla llamada t1 dentro de ella. La siguiente instrucción crea la tabla t1:

      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

    Nota

    En los siguientes ejemplos se crean vistas sobre la tabla t1 con distintos métodos de verificación de seguridad. El objetivo es mostrar las diferencias en los permisos entre DEFINER e INVOKER.

    • Para crear una vista llamada v1 y establecer SQL SECURITY en INVOKER, 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 v2 y establecer SQL SECURITY en DEFINER, 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 v3 sin especificar SQL SECURITY (en este caso, el sistema usa INVOKER de 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 user1 se conecta a la base de datos adb_demo del clúster de AnalyticDB for MySQL, solo puede consultar la vista v2. 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 user1 intenta consultar la vista v1 o v3. Instrucción de consulta:

      SELECT * FROM v1

      o bien

      SELECT * FROM v3

      Ambas instrucciones devuelven el siguiente error:

      ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view
    • Después de otorgar a user1 el permiso para consultar las tres vistas, use una cuenta con privilegios para concederle también el permiso de consulta sobre la tabla user1t1:

      GRANT SELECT ON adb_demo.t1 to user1@'%';

      Ahora, cuando user1 se conecta a la base de datos user1adb_demo del clúster de AnalyticDB for MySQL, puede consultar las vistas user1v1, v2 y v3. 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.