La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Vues. 2/51 Vues n Table deriveé des tables existants (table de base) u Accès adapte a besoin d'application (couche externe) u Stockage des requêtes u.

Présentations similaires


Présentation au sujet: "Vues. 2/51 Vues n Table deriveé des tables existants (table de base) u Accès adapte a besoin d'application (couche externe) u Stockage des requêtes u."— Transcription de la présentation:

1 Vues

2 2/51 Vues n Table deriveé des tables existants (table de base) u Accès adapte a besoin d'application (couche externe) u Stockage des requêtes u Protection des donneés n Utilization u Recherche comme table de base u MAJ largement limiteé

3 3/51 CREATE VIEW CREATE VIEW capitale_olympique (année, pays, capitale) ASSELECT année, JO.pays, capitale FROM JO, Pays WHERE JO.pays = Pays.nom

4 4/51 Utilisation des Vues n SELECT DISTINCT capitale FROM capitale_olympique ; n UPDATE capitale_olympique SET capitale = 'Berlin' WHERE pays = 'RDA';

5 5/51 MAJ des vues n Les modifications sont possibles si la requête ne contient pas de u Jointure u Opérateur dagrégation u Attribut calculé dans le SELECT u UNION, INTERSECT, DIFFERENCE, DISTINCT, GROUP BY, ORDER BY

6 6/51 Exemple n CREATE VIEW pays_europenne AS SELECT * FROM Pays WHERE continent = 'Europe' ; n UPDATE pays_europenne SET capitale = 'Berlin' WHERE nom = 'RDA'; Le changement est propagé vers la table de base!

7 7/51 Exemple – MAJ impossible n CREATE VIEW comparaison AS SELECT P1.nom, P1.population, P2.nom, P2.population FROM Pays P1, Pays P2 WHERE P1.population > P2.population ; DELETE ? Il n'existe aucune possibilité déliminer seulement ce tuple et de maintenir la consistance avec les tables de base

8 8/51 Vue Materialisée n Normalement, seulement la définition de la vue est stockée n Vue materialisée u Crée une novelle table contenant les résultats de la requête utilisée dans la définition de la vue u Si les tables de base changent: MAJ de la vue matérialisée CREATE MATERIALIZED VIEW capitale_olympique(année, pays, capitale) REFRESH FAST ON COMMIT ASSELECT année, JO.pays, capitale FROM JO, Pays WHERE JO.pays = Pays.nom ;

9 9/51 Commandes sur les vues n CREATE [OR REPLACE] VIEW nom_vue [ ( nv_nom_col)*] AS requête [WITH READ ONLY] [WITH CHECK OPTION] ; u OR REPLACE: remplace une vue existante u WITH READ ONLY: interdit les MAJ u WITH CHECK OPTION: insertions et modifications seulement si le tuple résultant est sélectionné par la vue n DROP VIEW nom_vue; n RENAME nom_vue TO nv_nom; n ALTER VIEW nom_vue COMPILE; u Recalcule une vue

10 Maintenir les contraintes d'intégrité

11 11/51 Contraintes d'intégrité n Plusieurs possibilités pour les maintenir u Définition des tables u Assertions u Triggers u Vues

12 12/51 Rappel n Contrainte sur une colonne (contrainte-col) u [NOT] NULL u UNIQUE u PRIMARY KEY n Contraintes sur une table (contrainte-table) u UNIQUE (nom-col)* u PRIMARY KEY (nom-col)* u FOREIGN KEY (nom-col)* REFERENCES nom_table [(nom-col)*]

13 13/51 Identifiant externe n Maintenir lintégrité référentielle u Lors de suppressions ou modifications d'un tuple dont l'identifiant est référencé par un identifiant externe n Exemple de problème u Pays(nom, capitale, population, surface) JO(lieu, pays, année) u Suppression d'un tuple de Pays: DELETE FROM Pays WHERE nom='Grece';

14 14/51 Maintenir integrite referentielle n Possibilités u Interdire l'opération u Mettre les valeurs de l'identifiant externe à NULL ou à une valeur défaut u En cas du suppression: éliminer aussi le tuple avec l'identifiant externe u En cas du modification: modifier également la valeur de l'identifiant externe

15 15/51 Exemple CREATE TABLE JO ( année DECIMAL(4,0), lieu VARCHAR(15), pays VARCHAR(20), PRIMARY KEY (année), FOREIGN KEY (pays) REFERENCES Pays (nom) ON DELETE SET NULL ON UPDATE CASCADE );

16 16/51 Contraintes complexes n Maintenir les conditions logique sur les tuples n Exemple u Pays(nom, capitale, population, surface) JO(lieu, pays, année) u JO.année 1896 u 3 jeux olympiques au maximum dans le même pays

17 17/51 Assertion simple n Spécification de la condition pendant la définition de la table u La condition est contrôlée avec chaque modification ou insertion n Exemple CREATE TABLE JO ( année DECIMAL(4,0), lieu VARCHAR(15), pays VARCHAR(20), PRIMARY KEY (année), FOREIGN KEY (pays) REFERENCES Pays (nom) ON DELETE SET NULL ON UPDATE CASCADE CHECK(année 1896) );

18 18/51 Assertion avec requête CREATE TABLE JO ( année DECIMAL(4,0), lieu VARCHAR(15), pays VARCHAR(20), PRIMARY KEY (année), FOREIGN KEY (pays) REFERENCES Pays (nom) ON DELETE SET NULL ON UPDATE CASCADE, CHECK(année 1896) CHECK(3 ALL (SELECT COUNT(*) FROM JO GROUP BY pays) );

19 19/51 Assertion globale n Condition sur plusiers tables u Definition independant d'une table n Exemple: deux jeux olympiques consécutifs ne se déroulent pas sur le même continent n CREATE ASSERTION JO_consecutive CHECK NOT EXISTS ( SELECT * FROM JO JO1, JO JO2, Pays P1, Pays P2 WHERE JO1.pays=P1.nom AND JO2.pays=P2.nom AND JO1.année=JO2.année+4 AND P1.continent=P2.continent); Les assertions complexes sont très coûteuses !

20 Triggers

21 21/51 Trigger n Concept de base de données active n Exécuter une opération suite à un changement survenu dans la base de données u Maintenir les contraintes d'intégrité u Logging et auditing des changements u Calculer des valeurs dérivées u Maintenir des règles de business u Maintenir des données répliquées et des vues complexes materialisées etc.

22 22/51 Evénement – Condition - Action n Un trigger est activé par un événement u Insertion, suppression ou modification sur une table n Si le trigger est activé, une condition est évaluée u Prédicat ou requête u Une requête est vraie si le résultat n'est pas vide n Si la condition est vraie l'action est exécutée u Insertion, suppression ou modification de la base de données (ou programme externe)

23 23/51 Exemple n CREATE TRIGGER MAJ_Pays AFTER UPDATE population ON Pays FOR EACH ROW WHEN surface > 0 BEGIN UPDATE Pays SET pop_avg = population/surface; END; événement condition action

24 24/51 Exécution d'un trigger n Avant, après ou au lieu de l'événement u AFTER | BEFORE | INSTEAD n Invocation de l'événement une fois par table ou pour tous les tuples affectés u [FOR EACH ROW] n Association avec une transaction u A la fin de la transaction en cours u Transaction séparée

25 25/51 Références aux valeurs modifiées n CREATE TRIGGER MAJ_Log AFTER UPDATE ON Pays FOR EACH ROW WHEN (new.surface <> old.surface) BEGIN INSERT INTO Pays_log (nom, surface) VALUES (:new.nom, 'surface_changée'); END;

26 26/51 Syntaxe des triggers (SQL 1999) CREATE TRIGGER [OR REPLACE] nom-du-trigger BEFORE | AFTER | INSTEAD OF INSERT | UPDATE | DELETE OF noms-d'attributs ON nom-table [FOR EACH ROW] WHEN (condition)

27 27/51 Attention n Les triggers sont très utiles et puissants n Mais: une utilisation prudente est nécessaire n Attention aux u Invocations de cascade de triggers u Utilisations excessives des ressources u Difficultés pour prévoir les conséquences

28 Embedded SQL

29 29/51 Embedded SQL - but n Inclure des commandes SQL dans un programme (Java, C, Cobol, Ada, Fortran, Pascal, …) u compléter SQL avec la puissance dexpressivité dun langage de programmation u Interactions avec lutilisateur, systèmes périphériques, … n Exemples u calculs, requêtes récursives, conversions, …

30 30/51 Principe dutilisation n Ecrire dans un LP quelconque un programme normal contenant en plus des ordres SQL u Le langage qui accueille les ordres SGBD: le langage hôte u Les ordres accueillis: ordres inclus n Gérer les éventuels problèmes de communication entre le programme et le SGBD u Transmission des données entre le langage hôte et SQL

31 31/51 Ordres inclus n Inclusion u Syntaxe dépend du langage hôte u En général: EXEC SQL END-EXEC u En C: EXEC SQL ; u En Java: #SQL { }; n Exécution u Précompilateur SQL détecte lexpressions SQL incluse u remplacée par un appel à une fonction de la bibliothèque de communication SGBD - langage hôte u transmise au SGBD lors de lexécution du programme par cette fonction

32 32/51 Transmission des données n Echange entre le SGBD et le programme réalisé au travers dune zone de communication u Zone de communication = ensemble de variables n Variables déchange utilisateur (hôtes) u données (insertions, interrogation) u information du programme pour le SGBD n Variables spéciales SGBD u informations du SGBD pour le programme

33 33/51 Exemple – requête (langage hôte C) … EXEC SQL BEGIN DECLARE SECTION; char titre[15]; /* titre obtenu par un utilisateur */ real sal; /* salaire */ EXEC SQL END DECLARE SECTION; … /* Code (omis) pour obtenir un titre */ EXEC SQL SELECT Salaire INTO :sal FROM Compensation WHERE Titre = :titre; /* Code (omis) pour imprimer le resultat */ … Déclaration des variables communes Transmission de données

34 34/51 Transmission dun ensemble de données n Le résultat d'une requête est une ensemble de données u Le langage hôte ne connaît pas le concept d'ensemble u Incompatibilité des langages ("Language impendance mismatch") n Tampon (Cursor) u zone mémoire nommée du programme à laquelle une requête est associée u taille dynamique réglée à lexécution u sert à contenir les n-uplets résultant de requête

35 35/51 Tampon n Principe dutilisation u Déclaration du tampon (DECLARE) u Remplissage du tampon en une seule fois par exécution de la requête (OPEN) u Récupération des n-uplets du tampon un par un (FETCH) u Libération du tampon (CLOSE) Avant 1. tuple Apres dernier tuple 1. tuple dernier tuple

36 36/51 Utilisation d'une tampon … EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE [options] CURSOR FOR [options]; EXEC SQL OPEN ; while(condition) { EXEC SQL FETCH FROM INTO ; if(tuple existe) traiter le tuple else break } EXEC SQL CLOSE ; …

37 37/51 Exemple … EXEC SQL DECLARE tamp1 CURSOR FOR SELECT nom, prenom FROM Etudiant WHERE cle = :cle; EXEC SQL OPEN tamp1 EXEC SQL FETCH FROM tamp1 INTO :nom, :prénom; EXEC SQL CLOSE tamp1; …

38 38/51 Options - Declaration EXEC SQL DECLARE [INSENSITIVE][SCROLL] CURSOR FOR [ORDER BY ][FOR READ ONLY]; n INSENSITIVE u le tampon est insensible aux changements dans la relation durant louverture n SCROLL u utilisation des options FETCH n ORDER BY trie l'ordre des tuples n FOR READ ONLY u l'accès ne change pas le contenu des tuples

39 39/51 Options - Accés EXEC SQL FETCH [FROM] [ NEXT | PRIOR | FIRST | LAST | RELATIVE[+|-]n | ABSOLUTE[+|-]n ] [INTO,…, ]

40 40/51 Termination des SQL statements n Unité de travail (= transaction) commence avec le premier ordre SQL ou avec COMMIT/ROLLBACK n COMMIT u Si on veut rendre le résultat de la transaction permanent u Syntaxe: EXEC SQL COMMIT; n ROLLBACK u Si on veut rejeter le résultat de la transaction u Syntax : EXEC SQL ROLLBACK;

41 41/51 Gestion des exceptions : WHENEVER n Gestion automatique des erreurs et warnings u teste tous les évènements qui suivent u En général, un WHENEVER avant le premier ordre SQL exécutable n Syntaxe EXEC SQL WHENEVER ;

42 42/51 WHENEVER n Evénement u SQLERROR, SQLWARNING u NOT FOUND : si pas de n-uplet trouvé n Action u CONTINUE, STOP (Rollback) u GOTO branch (à éviter), DO f() u DO BREAK et DO CONTINUE (à utiliser pour des boucles)

43 43/51 Exemple – mise a jour #include EXEC SQL INCLUDE SQLCA; main() { EXEC SQL WHENEVER SQLERROR GOTO error: EXEC SQL CONNECT TO Company; EXEC SQL BEGIN DECLARE SECTION; int pno1, pno2; /* two project numbers */ int amount; /* amount to be transferred */ EXEC SQL END DECLARE SECTION; /* Code (omitted) to read the project numbers and amount */ EXEC SQL UPDATE Project SET Budget = Budget + :amount WHERE Pno = :pno2; EXEC SQL UPDATE Project SET Budget = Budget - :amount WHERE Pno = :pno1; EXEC SQL COMMIT RELEASE; return(0); error: printf(update failed, sqlcode = %ld\n, SQLCODE); EXEC SQL ROLLBACK RELEASE; return(-1); }

44 44/51 SQL dynamique n Si l'ordre SQL exact n'est pas connu lors du développement de l'application u SQL nautorise pas les variables tables ou colonnes n Possibilité davoir le texte de lordre SQL entier contenu dans une variable n Syntaxe: EXEC SQL EXECUTE IMMEDIATE ;

45 45/51 Exemple EXEC SQL BEGIN DECLARE SECTION; char req[] = INSERT INTO EMP VALUES(E13, Jean Blanc,...); EXEC SQL END DECLARE SECTION; EXEC SQL EXECUTE IMMEDIATE :req; n Limitations :req ne peut pas retourner de résultat :req ne peut pas contenir de paramètres Chaque fois que :req est exécutée, elle est également compilée overhead important

46 46/51 Exécution préparée n Forme générale EXEC SQL PREPARE stmt FROM :string n Règle :string peut retourner des résultats d'une requête :string peut contenir des paramètres stmt nest pas une variable hôte, mais un identificateur de lordre utilisé par le pré-processeur

47 47/51 Exemple EXEC SQL BEGIN DECLARE SECTION ; char tup[] = INSERT INTO EMP VALUES(E13, Jean Blanc,...); EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE S1 FROM :tup; EXEC SQL EXECUTE S1;... EXEC SQL EXECUTE S1;

48 48/51 Paramétrisation n Utiliser des caractères joker - ? – là où les chaînes de caractères peuvent apparaître u "INSERT INTO Emp VALUES (?, ?, ?, ?)" pas à la place dun nom de relation, de colonne, etc n Utiliser des variables hôtes dans la clause USING pour indiquer les valeurs des paramètres u EXEC SQL EXECUTE S1 USING :eno, :ename, :title, :city u USING ne peut pas être employé avec EXECUTE IMMEDIATE

49 49/51 Exemple … EXEC SQL BEGIN DECLARE SECTION; char tup[] = INSERT INTO Emp VALUES (?,?,?,?); char eno[3], enom[15], titre[10], ville[12]; EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE S1 FROM :tup; /* obtenir les valeurs de :eno, etc. */ EXEC SQL EXECUTE S1 USING :eno, :ename, :titre, :ville; …

50 50/51 Tampons dynamiques n Si le résultat d'une requête est une ensemble, alors utiliser des tampons dynamiques n Définire des tampons dynamiques similaires à leurs contreparties statiques, mais utiliser u USING pour fournir les paramètres de la rêquete EXEC SQL DECLARE CURSOR FOR stmt; EXEC SQL OPEN USING :var1 [,…,:varn]; EXEC SQL FETCH INTO :out1 [,…,:outk]; EXEC SQL CLOSE ;

51 51/51 Exemple … EXEC SQL BEGIN DECLARE SECTION; char resp[10]; /* input: responsable */ char pno[3]; /* output: numéro du projet */ real avg-dur; /* output: durée moyenne */ char s[] = SELECT Pno, AVG(Dur) FROM Travaille_sur WHERE Resp = ? GROUP BY Pno, Eno HAVING COUNT(*) > 2; EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE S1 FROM :s; EXEC SQL DECLARE durée CURSOR FOR S1; /* obtenir la valeur du :resp */ EXEC SQL OPEN durée USING :resp; EXEC SQL WHENEVER NOT FOUND DO BREAK; while(1) { EXEC SQL FETCH FROM durée INTO :pno, :avg-dur traiter le tuple; } EXEC SQL CLOSE durée …


Télécharger ppt "Vues. 2/51 Vues n Table deriveé des tables existants (table de base) u Accès adapte a besoin d'application (couche externe) u Stockage des requêtes u."

Présentations similaires


Annonces Google