Initiation à SQL

Création de vues

Comme nous l'avons déjà décrit dans la section Vues, une vue offre une autre possibilité de visualiser les données d'une ou de plusieurs tables. La création de vues permet de choisir les informations à afficher selon les utilisateurs auxquelles elles sont destinées. Le diagramme suivant montre les relations entre les vues et les tables.

Dans la Figure 2, Vue_A limite l'accès aux colonnes AC1 et AC2 de la TABLE_A.

Vue_AB autorise l'accès à la colonne AC3 de la TABLE_A et à la colonne BC2 de la TABLE_B.

La création de la Vue_A restreint l'accès à la TABLE_A. La création de la Vue_AB limite l'accès à certaines colonnes des deux tables.

Figure 2. Relations entre les tables et les vues


REQTEXT

L'instruction suivante crée une vue des employés du service 20 de la table STAFF qui ne sont pas des directeurs. Leur salaire et leur commission, présents dans la table de base, n'apparaissent pas dans la vue.

  
     CREATE VIEW STAFF_ONLY
        AS SELECT ID, NAME, DEPT, JOB, YEARS
              FROM STAFF
              WHERE JOB <> 'Mgr' AND DEPT=20

Après la création de la vue, l'instruction suivante affiche son contenu :

     SELECT * 
        FROM STAFF_ONLY

Cette instruction donne le résultat suivant :

      
ID     NAME      DEPT   JOB   YEARS 
------ --------- ------ ----- ------
    20 Pernal        20 Sales      8
    80 James         20 Clerk      -
   190 Sneider       20 Clerk      8

Nous pourrons ensuite utiliser les tables STAFF et ORG pour créer une vue qui liste les noms de tous les services accompagnés du nom de leur directeur. L'instruction suivante crée la vue ci-après :

  
     CREATE VIEW DEPARTMENT_MGRS
        AS SELECT NAME, DEPTNAME
              FROM STAFF, ORG
              WHERE MANAGER = ID

Lors de la création d'une vue, la clause WITH CHECK OPTION permet d'ajouter des contraintes aux insertions et aux mises à jour d'une table. Si cette clause est présente, le gestionnaire de bases de données vérifie que les mises à jour ou les insertions apportées à la vue sont conformes à la définition de la vue et refuse celles qui ne le sont pas. En l'absence de cette clause, les insertions et les mises à jour ne sont pas comparées à la définition de la vue. Pour plus de détails sur la clause WITH CHECK OPTION, reportez-vous à la description de l'instruction CREATE VIEW dans le document SQL Reference.

Utilisation de vues pour manipuler des données

Comme l'instruction SELECT, les instructions INSERT, DELETE et UPDATE sont appliquées à une vue, comme s'il s'agissait d'une table réelle. Les instructions manipulent les données de la ou des tables sous-jacentes. Ainsi, lors de l'accès suivant à la vue, cette dernière est comparée à la dernière table de base, ou aux plus récentes. En l'absence de la clause WITH CHECK OPTION, les données que vous modifiez en passant par une vue risquent de ne pas apparaître lors des accès suivants à cette dernière, puisqu'il est possible qu'elles ne correspondent plus à la définition d'origine de la vue.

Voici un exemple de mise à jour s'appliquant à la vue FIXED_INCOME :

     CREATE VIEW FIXED_INCOME (LNAME, DEPART, JOBTITLE, NEWSALARY)
        AS SELECT NAME, DEPT, JOB, SALARY
              FROM PERS
              WHERE JOB <> 'Sales' WITH CHECK OPTION

     UPDATE FIXED_INCOME
        SET NEWSALARY = SALARY * 1.10
        WHERE LNAME = 'Li'

La mise à jour de la vue précédente équivaut à la mise à jour de la table de base PERS, sans l'option de vérification (la clause WITH CHECK OPTION est absente) :

     UPDATE PERS
        SET SALARY = SALARY * 1.10
        WHERE NAME = 'Li'
          AND JOB <> 'Sales'

La vue étant créée avec la clause WITH CHECK OPTION pour la contrainte JOB <> 'Sales' dans la vue CREATE VIEW FIXED_INCOME, la mise à jour suivante n'est pas autorisée si Limoges devient vendeur :

     UPDATE FIXED_INCOME
        SET JOBTITLE = 'Sales'
        WHERE LNAME = 'Limoges'

Les colonnes définies par des expressions telles que SALARY + COMM ou SALARY * 1,25 ne peuvent pas être mises à jour. Si vous définissez une vue contenant une ou plusieurs colonnes de ce type, le privilège UPDATE sur ces colonnes n'est pas accordé au propriétaire. Les instructions INSERT ne sont pas autorisées sur les vues contenant de telles colonnes. Par contre, les instructions DELETE sont autorisées.

Etudions une table PERS, dans laquelle aucune des colonnes n'est de type NOT NULL. Il est possible de passer par la vue FIXED_INCOME pour insérer des lignes dans la table PERS, même si la vue ne contient pas les colonnes ID, YEARS, COMM et BIRTHDATE de la table PERS sous-jacente. Les colonnes qui n'apparaissent pas dans la vue prennent la valeur NULL ou la valeur par défaut, selon le cas.

Cependant, dans la table PERS, la colonne ID est de type NOT NULL. Si vous passez par la vue FIXED_INCOME pour tenter d'insérer une ligne, le système essaie d'insérer des valeurs NULL dans toutes les colonnes de la table PERS "invisibles" dans la vue. Comme la colonne ID n'est pas incluse dans la vue et n'accepte pas les valeurs NULL, le système ne vous permet pas d'insérer une ligne en passant par la vue.

Pour connaître les règles et les restrictions s'appliquant à la modification des vues, reportez-vous à la description de l'instruction CREATE VIEW dans le document SQL Reference.


[ Début de page | Page précédente | Page suivante | Table des matières | Index ]