420-PK6-SL Banques de données Avancées LES VUES
CAS D'UTILISATION Prenons en exemple cette requête complexe : SELECT a.tablespace_name, a.contents, a.extent_management, a.allocation_type, a.segment_space_management, a.bigfile, a.status, nvl(sum(b.count_files),0), nvl(sum(b.bytes),0), nvl(sum(b.maxbytes),0), nvl(sum(b.bytes),0)-nvl(sum(c.free_bytes),0) fromdba_tablespaces a, ( select TABLESPACE_NAME, sum(bytes) bytes, count(*) count_files, sum(greatest(maxbytes,bytes)) maxbytes from DBA_DATA_FILES group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes), count(*), sum(greatest(maxbytes,bytes)) maxbytes from DBA_TEMP_FILES group by TABLESPACE_NAME )b, ( select TABLESPACE_NAME, sum(bytes) free_bytes from DBA_FREE_SPACE group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes_free) free_bytes from V$TEMP_SPACE_HEADER group by TABLESPACE_NAME ) c where a.tablespace_name = b.tablespace_name(+) and a.tablespace_name = c.tablespace_name(+) group by a.tablespace_name, a.contents, a.extent_management, a.allocation_type, a.segment_space_management, a.bigfile, a.status order by a.tablespace_name;
CAS D'UTILISATION Cette requête comtiens deux requêtes imbriquées soit : select TABLESPACE_NAME, sum(bytes) bytes, count(*) count_files, sum(greatest(maxbytes,bytes)) maxbytes from DBA_DATA_FILES group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes), count(*), sum(greatest(maxbytes,bytes)) maxbytes from DBA_TEMP_FILES group by TABLESPACE_NAME et une autre simillaire. Notez aussi que cette requête en est une d'agglomération entre deux SELECT.
CAS D'UTILISATION Ce cas est une application idéale pour les vues. En effet, si nous créons une vue de la première requête imbriquée comme ceci : CREATE VIEW TBSpace1 AS select TABLESPACE_NAME, sum(bytes) bytes, count(*) count_files, sum(greatest(maxbytes,bytes)) maxbytes from DBA_DATA_FILES group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes), count(*), sum(greatest(maxbytes,bytes)) maxbytes from DBA_TEMP_FILES group by TABLESPACE_NAME;
CAS D'UTILISATION Et que nous faisons de même pour la seconde table imbriquée : CREATE VIEW TBSpace2 AS select TABLESPACE_NAME, sum(bytes) free_bytes from DBA_FREE_SPACE group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes_free) free_bytes from V$TEMP_SPACE_HEADER group by TABLESPACE_NAME;
Notre requête du début deviendrait : SELECT a.tablespace_name, a.contents, a.extent_management, a.allocation_type, a.segment_space_management, a.bigfile, a.status, nvl(sum(b.count_files),0), nvl(sum(b.bytes),0), nvl(sum(b.maxbytes),0), nvl(sum(b.bytes),0)-nvl(sum(c.free_bytes),0 fromdba_tablespaces a, TBSpace1 b, TBSpace2 c CAS D'UTILISATION where a.tablespace_name = b.tablespace_name(+) and a.tablespace_name = c.tablespace_name(+) group by a.tablespace_name, a.contents, a.extent_management, a.allocation_type, a.segment_space_management, a.bigfile, a.status order by a.tablespace_name; Pas mal simplifiée n'est-ce pas!
CAS D'UTILISATION Cependant, lors de la tentative de création de la vue, Oracle répond avec le message d'erreur suivant : CREATE VIEW TBSpace1 AS select TABLESPACE_NAME, sum(bytes) bytes, count(*) count_files, sum(greatest(maxbytes,bytes)) maxbytes from DBA_DATA_FILES group by TABLESPACE_NAME union all select TABLESPACE_NAME, sum(bytes), count(*), sum(greatest(maxbytes,bytes)) maxbytes from DBA_TEMP_FILES group by TABLESPACE_NAME; ERREUR Ó la ligne 4 : ORA-01031: privilèges insuffisants
IMPORTANT Le compte SYSTEM possède le rôle DBA. Mais ce n'est pas suffisant pour accomplir la tâche de création de Vues impliquant des Vuesdu schéma d'oracle et DBA_DATA_FILES est une vue appartenant au schéma d'oracle. Notez qu'on peux effectuer des SELECT sur cette vue en étant connecté comme SYSTEM mais pas créer d'autres vues à partir de celles-ci. Il nous faut donc une élévationde plus et donc le niveau SYSDBA. Pour obtenir ce niveau, il faut se connecter comme suit : CONNECT SYSTEM/Oracle AS SYSDBA Une fois connecté de cette manière, on peux créer les deux vues et exécuter la requête initiale en faisant appel aux vues plutôt que d'imbriquer les requêtes secondaires.
DÉFINITION C'est quoi une Vue? Quand on lance une requête, Oracle crée une table temporaire et libère l'espace mémoire occupée par celle-ci dès qu'elle est affichée. Une vue c'est une forme de requête déguisée en table. Lors de la création d'une vue: Oracle sauve la requête qui a servi à créer la vue Oracle fait croire que la requête est une table Une vue est dynamique, ce qui veux dire qu'elle se comporte comme une table et on peux y opérer des SELECT, des INSERT INTO, des DELETE FROM, des UPDATE. Cependant, il y a certaines restrictions sur la création des vues pour que celles-ci acceptent ces commandes.
Une vue peux être bâti à partir : DÉFINITION d'une requête partielle sur une table Permet de cacher certains champs à certains utilisateurs d'une jointure entre deux tables Permet de regrouper des champs afin de faciliter l'ajout d'une table avec des clauses particulières Permet de simplifier l'écriture (sauvegarde de requêtes)
DÉFINITION Exemple : Supposons la table Abonnés contentant les champs suivants : Code, Nom, Prenom, NAS, Age, CCrédit, Adresse, Tele, Email Supposons maintenant que la plupart des employés de l'entreprise aient besoin d'accéder aux informations usuellesdes clients mais n'aient pas le droit d'accéder aux informations plus personnelles des clients. On créeras alors une vue pour ces employés On leurs retirera les privilèges sur la table Abonnés On leurs accordera tous les privilèges sur la vue.
DÉFINITION Table Abonnés: Code, Nom, Prenom, NAS, Age, CCrédit, Adresse, Tele, Email CREATE VUE Clients AS SELECT Nom, Prenom, Age, Adresse, Tele, Email; Notez que la vue ne présente pas les champs NAS et CCrédit. Ainsi nos employés pourront manipuler la clientelle, soit INSÉRER de nouveaux clients, SUPPRIMER des clients, APPORTER de corrections, s'ils en ont le privilège bien entendu.
CONDITIONS ET RESTRICTIONS Afin de pouvoir créer des Vuesdans notre propre schéma, il faut posséder le privilège CREATE VIEW Afin de pouvoir créer des Vuesdans d'autres schémas, il faut posséder le privilège CREATE ANY VIEW L'emploi de WITH READ ONLY crée une Vueen lecture seule. Aucune forme d'édition ne peux y être apporté. L'emploi de WITH CHECK OPTION empêche tout changements à la Vueou aux tables référés par celle-ci si ces changements produisent une violation de contrainte de validation à valeurs multiples.
SYNTAXE La syntaxe de base est : CREATE VIEW sonnom AS requête; A cette syntaxe on peux ajouter les éléments suivants : OR REPLACE Permet de recréer une vue. Ex.: CREATE OR RECRETATE VIEW mavue AS requête; FORCE Permet de créer une Vuemême si les tables n'existent pas. On peux préfixer le nom de la vue du nom d'un usager Ex. : CREATE VIEW db.savueas Cette instruction créera la vue dans le schéma de l'usager db même si on est connecté en tant que autreusager.
CONDITIONS ET RESTRICTIONS Afin qu'une vue soit éditable, les conditions suivantes doivent être respectées : Chaque colonne de la Vuedoit correspondre à une et une seule colonne d'une table visé par la Vue. La Vuene doit contenir aucun des éléments suivants : Un opérateur d'ensemble Une clause DISTINCT Des agrégats ou GROUP BY des clauses ORDER BY des clauses MODEL des clauses CONNECT BY des clauses START WITH Une collection spécifiée par une liste de choix SELECT Une sous-requête Une sous-requête "Lecture seule"
CONDITIONS ET RESTRICTIONS Afin qu'une vue soit éditable, les conditions suivantes doivent être respectées (suite): Pour qu'une Vuecontenant des jointuressoit éditableles conditions suivantes doivent êtres toutes respectées : La jointure doit stipuler une seule table Afin d'accomplir des INSERT et des UPDATE: La Vuene doit pas avoir été créée avec l'option WITH CHECK OPTION Toute colonne où des données seraient insérées doivent provenir d'une table key-preserved. Une table key-preservedest une table dont toute clé primaire dans la table de base demeure une clé primaire dans le résultat de la jointure.
EXEMPLES Une Vueen lecture seule : CREATE VIEW mavue AS SELECT Code, Nom, Adresse, Tele, Emain FROM Clients WITH READ ONLY; Recréer une vue : CREATE OR RECREATE VIEW mavue AS SELECT Code, Nom, Adresse, Tele, Emain FROM Clients;
EXEMPLES WITH CHECK OPTION Supposons la contrainte de vérification sur un champ d'une table: region VARCHAR2(12) CONSTRAINT valideregion CHECK ( regionin 'nord','sud','est', 'ouest') Si une Vueest créée avec WITH CHECK OPTION Une mise-à-jour de celle-ci ne sera pas permise si elle viole la contrainte de validation de la table sous-jacente. Oracle réagira par le message d'erreur suivant : ORA-01402 : view WITH CHECK OPTION where-clause violation
EXEMPLES Une Vue avec calculs (csl): CREATE VIEW grille AS SELECT Qte, DESCR as "Descr.", Cout as "Coût", (Cout * Qte) as "STotal", ((Cout* Qte)* 0.05) as "TPS", (((Cout* Qte)+ ((Cout* Qte) * 0.05)) * 0.095) as "TVQ", ((Cout* Qte) + ((Cout* Qte) * 0.05) + (((Cout* Qte) * 0.05) * 0.095) ) as "Total" FROM ArticlesFin;
EXEMPLES Une Vueavec calculs et noms de colonnes prédéfinis : CREATE OR REPLACE VIEW grille ( Qte, Descr, Cout, STotal, TPS, TVQ, Total ) AS SELECT QTE, DESCR, COUT, (Cout * Qte), ((Cout* Qte)* 0.05), (((Cout* Qte)+ ((Cout* Qte) * 0.05)) * 0.095), ((Cout* Qte) + ((Cout* Qte) * 0.05) + (((Cout* Qte) * 0.05) * 0.095) ) FROM ArticlesFin;
EXEMPLES Cette Vue aura la structure suivante : SQL> DESC grille; Nom NULL? Type ----------- -------- ---------------------- QTE NUMBER(38) DESCR VARCHAR2(32) COUT NUMBER(12,2) STOTAL NUMBER TPS NUMBER TVQ NUMBER TOTAL NUMBER
Cette Vue est-elle éditable? QUESTION Peut-on y insérer des valeurs si on omet les champs calculés?