FirebirdSQL logo
 INDEXTRIGGER 

Vues modifiables

Une vue peut être mise à jour ou en lecture seule.Si une vue peut être mise à jour, les données auxquelles elle donne accès peuvent être modifiées à l’aide des opérateurs DML INSERT, UPDATE, DELETE, UPDATE OR INSERT, MERGE.Les modifications effectuées sur la vue sont appliquées à la ou aux tables sous-jacentes.

Une vue en lecture seule peut être mise à jour à l’aide de déclencheurs auxiliaires.Une fois qu’un ou plusieurs déclencheurs sont définis sur une vue, les changements ne sont pas automatiquement propagés à la table de base, même si la vue pouvait être mise à jour auparavant.Dans ce cas, la responsabilité de la mise à jour (suppression ou insertion) des entrées de la table de base incombe au programmeur qui a défini les triggers.

Les conditions suivantes doivent être remplies pour qu’une vue puisse être mise à jour :

  • L’instruction de sélection SELECT n’accède qu’à une seule table ou une seule vue qui peut être modifiée ;

  • L’instruction de sélection SELECT ne doit pas accéder aux procédures stockées ;

  • Toutes les colonnes de la table de base ou de la vue actualisable qui ne sont pas présentes dans une vue donnée doivent satisfaire à l’une des conditions suivantes

    • autoriser la valeur "NULL

    • Les colonnes NOT NULL doivent avoir une valeur par défaut.

    • Les colonnes NOT NULL doivent être initialisées dans les triggers de la table de base.

  • L’instruction de sélection SELECT ne contient pas de champs définis par des sous-requêtes ou d’autres expressions ;

  • L’instruction de sélection SELECT ne contient pas les champs définis par les fonctions d’agrégation (MIN, MAX, AVG, COUNT, LIST), les fonctions statistiques (CORR, COVAR_POP, COVAR_SAMP etc.), les fonctions de régression linéaire (REGR_AVGX, REGR_AVGY etc.) et toutes sortes de fonctions de fenêtre ;

  • L’instruction de sélection SELECT ne contient pas de phrases ORDER BY, GROUP BY, HAVING ;

  • L’instruction de sélection SELECT ne contient pas le mot-clé DISTINCT et les restrictions sur le nombre de lignes utilisant ROWS, FIRST/SKIP, OFFSET/FETCH.

WITH CHECK OPTIONS

La clause facultative WITH CHECK OPTIONS exige que la vue modifiée vérifie les données nouvellement insérées ou modifiées par rapport à la condition spécifiée dans la clause WHERE de l’instruction de sélection SELECT.Lorsqu’on tente d’insérer un nouvel enregistrement ou de modifier un enregistrement, on vérifie si la condition de la clause WHERE est remplie pour cet enregistrement ; si la condition n’est pas remplie, l’insertion/modification n’est pas effectuée et un message de diagnostic correspondant est émis.

La clause WITH CHECK OPTION ne peut être spécifiée dans une instruction de création de vue que si la clause WHERE est spécifiée dans l’instruction principale SELECT de la vue.Sinon, un message d’erreur s’affiche.

Note

Si la clause WITH CHECK OPTIONS est utilisée, le système vérifie les valeurs d’entrée par rapport à la condition de la clause WHERE avant de les transmettre à la table de base.Ainsi, si les valeurs d’entrée ne passent pas le contrôle, les phrases DEFAULT ou les triggers sur la table de base, ne peuvent pas corriger les valeurs d’entrée car les actions ne seront jamais exécutées.

De plus, les champs de vue non spécifiés dans l’instruction INSERT sont transmis à la table de base en tant que valeurs NULL, indépendamment de leur présence ou absence dans l’instruction WHERE.Par conséquent, les valeurs par défaut définies sur ces champs de la table de base ne seront pas appliquées.D’autre part, les déclencheurs seront appelés et fonctionneront comme prévu.

Pour les vues sans clause WITH CHECK OPTIONS, les champs manquants dans l’instruction INSERT ne sont pas transmis du tout, donc toutes les valeurs par défaut seront appliquées.