Une vue est une table virtuelle construite à partir du résultat d'une requête sur une ou plusieurs tables. Elle ne stocke pas de données réelles. Les vues simplifient les requêtes complexes et renforcent la sécurité des données. Cette rubrique explique comment créer une vue à l'aide de l'instruction CREATE VIEW.
Remarques d'utilisation
AnalyticDB for MySQL adopte un comportement compatible avec celui des vues MySQL, comme suit :
-
Versions antérieures à 3.1.9.0
Les clusters AnalyticDB for MySQL ne prennent pas en charge le comportement par défaut de MySQL. Après l'ajout ou la suppression de colonnes dans une vue, l'interrogation de cette vue à l'aide de
SELECT * FROM <view_name>;produit un comportement différent de celui de MySQL. Le système détecte une incohérence dans le nombre de colonnes et considère que la vue n'est plus disponible. Dans ce cas, l'erreur suivante est renvoyée :View '<view_name>' is stale; it must be re-created. -
V3.1.9.0 et versions ultérieures
Les clusters AnalyticDB for MySQL prennent en charge le comportement par défaut de MySQL. Lors de la création d'une vue, le cluster développe l'astérisque
*présent dans l'instruction SQL en colonnes explicites avant de stocker ladite instruction. Par la suite, l'ajout ou la suppression de colonnes n'affecte plus la vue.
Nous vous recommandons d'utiliser un cluster exécutant la version V3.1.9.0 ou ultérieure pour créer des vues. Cela garantit la compatibilité avec le comportement par défaut de MySQL et évite les sémantiques inattendues ainsi que les erreurs provoquées par l'utilisation de * dans les vues.
Pour afficher la version mineure d'un cluster Data Lakehouse Edition, exécutez SELECT adb_version();. Pour mettre à niveau la version mineure, contactez le support technique.
Pour les clusters AnalyticDB for MySQL exécutant la version V3.1.9.0 ou ultérieure et compatibles avec le comportement MySQL, des effets secondaires peuvent survenir dans des cas particuliers. Par exemple, si vous renommez une colonne C en D et que la vue doit référencer précisément les colonnes A, B et C, la vue devient indisponible et une erreur est renvoyée, car la colonne C n'existe plus. Ce comportement est attendu. Une erreur est renvoyée même si la requête n'utilise pas finalement la colonne C, car l'élimination des colonnes (column pruning) intervient lors de la phase d'optimisation, tandis que les vérifications de syntaxe SQL et des autorisations ont lieu lors de la phase d'analyse. En revanche, dans les versions antérieures à 3.1.9.0, toutes les vérifications aboutissent et aucune erreur n'est renvoyée, car seul le nombre de colonnes de la vue est contrôlé ; ce nombre reste identique après l'opération de renommage et le nombre de colonnes référencées par l'astérisque * actuel est cohérent. Une fois la vérification de disponibilité de la vue passée, la colonne C est mappée à la troisième colonne selon l'ordre de la table de base. Même si vous interrogez la colonne C après l'opération de renommage, aucune erreur n'est renvoyée et les résultats de la requête sont inattendus.
Si votre activité nécessite le comportement spécifique des clusters AnalyticDB for MySQL exécutant des versions antérieures à 3.1.9.0, vous pouvez ajouter une indication (hint) spécifique ou configurer un paramètre lors de la création des vues pour obtenir le comportement souhaité.
-
Pour configurer une seule vue, ajoutez
/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/. L'exemple suivant montre comment ajouter cette indication :/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ CREATE VIEW v0 AS SELECT * FROM base0; Pour configurer toutes les vues du cluster, exécutez l'instruction suivante :
SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;
Syntaxe
CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;
|
Paramètre |
Obligatoire |
Description |
|
|
Non |
Crée une vue en appliquant une règle choisie selon l'existence ou non d'une vue portant le même nom. Les règles sont les suivantes :
Remarque
Si ce paramètre n'est pas spécifié et qu'une vue portant le même nom existe, la création de la vue échoue. |
|
|
Méthode de vérification de sécurité utilisée lors de l'interrogation des données d'une vue. Valeurs possibles :
Remarque
|
|
|
|
Oui |
Nom de la vue. Remarque
Vous pouvez également ajouter un nom de base de données avant le nom de la vue pour spécifier la base de données à laquelle la vue appartient, par exemple |
|
|
Source de données de la vue. |
Exemples
-
Préparer les données de test
Utilisez un compte privilégié du cluster AnalyticDB for MySQL pour effectuer les opérations suivantes :
-
Créez un compte nommé
user1:CREATE USER user1 IDENTIFIED BY 'user1_pwd'; -
Créez une base de données nommée
adb_demoet une table nomméet1dans cette base de données. L'instruction suivante crée la tablet1:Create Table `t1` ( `id` bigint AUTO_INCREMENT, `id_province` bigint NOT NULL, `user_info` varchar, primary key (`id`) ) DISTRIBUTED BY HASH(`id`);Insérez des données de test dans la table
t1:INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
-
-
Créer des vues
RemarqueLes exemples suivants créent des vues sur la table
t1en utilisant différentes méthodes de vérification de sécurité, afin de démontrer les différences d'effets sur les autorisations entreDEFINERetINVOKER.-
Pour créer une vue nommée
v1et définirSQL SECURITYsurINVOKER, exécutez l'instruction suivante :CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Pour créer une vue nommée
v2et définirSQL SECURITYsurDEFINER, exécutez l'instruction suivante :CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT id_province,user_info FROM t1 WHERE id_province=1; -
Pour créer une vue nommée
v3sans spécifierSQL SECURITY(dans ce cas, le système utiliseINVOKERpar défaut), exécutez l'instruction suivante :CREATE VIEW v3 AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
-
-
Comparer les autorisations
-
Utilisez un compte privilégié pour accorder à
user1uniquement l'autorisation d'interroger les trois vues :GRANT SELECT ON adb_demo.v1 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v2 TO 'user1'@'%'; GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';Dans ce cas, après que
user1s'est connecté à la base de donnéesadb_demodu cluster AnalyticDB for MySQL,user1ne peut interroger que la vuev2. Instruction de requête :SELECT * FROM v2;Le résultat suivant est renvoyé :
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+Cependant, une erreur est renvoyée lorsque
user1interroge la vuev1ouv3. Instruction de requête :SELECT * FROM v1ou
SELECT * FROM v3Les deux instructions renvoient l'erreur suivante :
ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view -
Après avoir accordé à
user1l'autorisation d'interroger les trois vues, utilisez un compte privilégié pour accorder àuser1l'autorisation d'interroger la tablet1:GRANT SELECT ON adb_demo.t1 to user1@'%';Dans ce cas, après que
user1s'est connecté à la base de donnéesadb_demodu cluster AnalyticDB for MySQL,user1peut interroger toutes les vuesv1,v2etv3. Instruction de requête :SELECT * FROM v1;ou
SELECT * FROM v2;ou
SELECT * FROM v3;Les trois instructions de requête renvoient le même résultat :
+-------------+-----------+ | ID_PROVINCE | USER_INFO | +-------------+-----------+ | 1 | Tom | | 1 | Jerry | +-------------+-----------+
-
FAQ
Les noms de colonnes définis en minuscules dans une table de base apparaissent en majuscules dans le jeu de résultats de la vue. Pourquoi ?
Les noms de colonnes du jeu de résultats d'une vue AnalyticDB for MySQL sont insensibles à la casse par défaut. Si vous souhaitez que les noms de colonnes du jeu de résultats de la vue soient en minuscules, vous pouvez définir la valeur de VIEW_OUTPUT_NAME_CASE_SENSITIVE sur true, ce qui indique la sensibilité à la casse. Pour ce faire, exécutez l'instruction suivante :
SET ADB_CONFIG VIEW_OUTPUT_NAME_CASE_SENSITIVE=true;
Bonnes pratiques
Pour plus d'informations, consultez Gestion des autorisations à l'aide des vues.