Cours Bases de données 2ème année IUT Cours Bilan : Des vues à PL/SQL corrigé Anne Vilnat http://www.limsi.fr/individu/anne/cours
Plan 1 Cas exemple 2 Les tables... 3 Vues et index 4 Privilèges 5 Fonctions et procédures 6 Déclencheurs
Présentation du cas La base exemple Les informations ci-dessous décrivent partiellement une base de données utilisée par un site de petites annonces automobiles. Seules les annonces proposées il y a moins d un mois seront visibles, néanmoins un client pourra re-proposer une annonce. CLIENT (login, mdp, nom, prenom, tel, mel) PROPOSE ( ref, login, datesoumis, datevente) ANNONCE (ref, IDmodele, km, Annee, prix) MODELE (IDmodele, modele, marque, CVfiscaux)
Schéma du cas CLIENT PROPOSE login mdp nom pernom tel mel ref login datesoumis datevente ref IdModele km annee prix ANNONCE IdModele modele marque CVFiscaux MODELE Ordre chronologique de création des tables? Q2 A : MODELE, CLIENT, PROPOSE, ANNONCE B : MODELE CLIENT, ANNONCE, PROPOSE C : CLIENT, MODELE, ANNONCE, PROPOSE D : les 3 sont justes E : Aucune n est juste
Schéma du cas CLIENT PROPOSE login mdp nom pernom tel mel ref login datesoumis datevente ref IdModele km annee prix ANNONCE IdModele modele marque CVFiscaux MODELE Ordre chronologique de création des tables? MODELE ANNONCE CLIENT PROPOSE
Création de la table Propose (avec toutes les contraintes qui semblent judicieuses)??? Q3 A CREATE TABLE PROPOSE ( login INTEGER constraint CIR PROPOSE CLIENT REFERENCES CLIENT, ref INTEGER constraint CIR PROPOSE ANNONCE REFERENCES ANNONCE, datesoumis DATE default sysdate, datevente DATE, constraint CK DATES CHECK (datesoumis<=datevente), constraint PK PROPOSE PRIMARY KEY (login, ref, datesoumis) B CREATE TABLE PROPOSE ( login INTEGER PRIMARY KEY, ref INTEGER constraint CIR PROPOSE ANNONCE REFERENCES ANNONCE, datesoumis DATE default sysdate, datevente DATE, constraint CK DATES CHECK (datesoumis<=datevente) C CREATE TABLE PROPOSE ( login INTEGER PRIMARY KEY, ref INTEGER PRIMARY KEY, datesoumis DATE default sysdate PRIMARY KEY, datevente DATE, constraint CK DATES CHECK (datesoumis<=datevente)
Création Création de la table Propose CREATE TABLE PROPOSE ( login INTEGER constraint CIR PROPOSE CLIENT REFERENCES CLIENT, ref INTEGER constraint CIR PROPOSE ANNONCE REFERENCES ANNONCE, datesoumis DATE default sysdate, datevente DATE, constraint CK DATES CHECK (datesoumis<=datevente), constraint PK PROPOSE PRIMARY KEY (login, ref, datesoumis)
Ajout Ajouter un client dans la table CLIENT??? Q4 A : INSERT INTO CLIENT (login, mdp, prenom, nom, mel, tel) VALUES(123, 321, Paul, Hochon, ph@base.fr, 012245 ) B : INSERT INTO CLIENT VALUES(123, 321, Paul, Hochon, ph@base.fr, 012245 ) C : INSERT INTO CLIENT VALUES(123, 321, Hochon, Paul, 012245, ph@base.fr ) D : INSERT INTO CLIENT VALUES(123, 321, Hochon, Paul, ph@base.fr )
Ajout Ajouter un client dans la table CLIENT : A : INSERT INTO CLIENT (login, mdp, prenom, nom, mel, tel) VALUES(123, 321, Paul, Hochon, ph@base.fr, 012245 ) ou C : INSERT INTO CLIENT VALUES(123, 321, Hochon, Paul, 012245, ph@base.fr )
Vue du nombre de voitures vendues par un client??? Q5 A CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login AND datevente is NOT NULL B CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login AND datevente is NOT NULL GROUP BY login, nom, mel C CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login AND datevente is NOT NULL GROUP BY login D CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login GROUP BY login, nom, mel
Vue du nombre de voitures vendues par un client??? B CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login AND datevente is NOT NULL GROUP BY login, nom, mel
Modification d une vue Modifier une vue? Q6 Si vous remarquez une erreur sur le nom (par exemple, totoˆ21ˆm au lieu de toto) pouvez-vous la corriger? Oui/Non
Modification d une vue Modifier une vue Si vous remarquez une erreur sur le nom (par exemple, totoˆ21ˆm au lieu de toto) pouvez-vous la corriger? Pour rappel CREATE VIEW nb Vendues AS select login,nom,mel,count(ref) as nbvendues FROM CLIENT C, Propose P WHERE C.login=P.login AND datevente is NOT NULL GROUP BY login, nom, mel Modifiable Non modifiable, car il y a une fonction d aggrégation (count)
Index? Pour accélérer les requêtes... Q7 En supposant le nombre de données très important, quels sont les index qu il serait judicieux de créer explicitement pour accélérer l exécution des requêtes sur cette vue.??? A : P.login B: C.nom C. prenom D : aucun
Index? Pour accélérer les requêtes... En supposant le nombre de données très important, quels sont les index qu il serait judicieux de créer explicitement pour accélérer l exécution des requêtes sur cette vue.??? A : P.login
Création d une autre vue Vue sur des voitures... Créer une vue permettant d afficher toutes les annonces de Peugeot 206 GT (ref, nbkm, prix, année) indépendemment de savoir si elles sont proposées, vendues,...???
Création d une autre vue Vue sur des voitures... CREATE VIEW PEUGEOT206GT as SELECT ref, km, prix, annee from ANNONCE A, MODELE M WHERE A.IDmodele=M.IDmodele AND marque= Peugeot AND modele= 206 GT Modifier une vue Si vous remarquez une erreur sur une année pouvez-vous la corriger? Oui/Non/Peut-être? Et si oui, le faire!
Modification d une vue Modifier une vue Si vous remarquez une erreur sur une année pouvez-vous la corriger? Oui/Non/Peut-être? Et si oui, le faire! Modifier une vue modifiable : car préservation de la clé UPDATE PEUGEOT206GT SET annee=2006 WHERE annee=06 Question subsidiaire : où est faite la modification??? A : Dans la vue B : Dans la table Annonce C : Dans la table Modèle D : partout
Encore une vue... Vue sur des voitures... CREATE VIEW VISIBLE AS SELECT modele,marque,km,prix,mel,p.ref, datesoumis FROM CLIENT C, Propose P, Annonce A, modele M WHERE C.login=P.login AND P.ref=A.ref AND A.IDmodele=M.IDmodele AND months between(datevente,sysdate) <1 Modifiable sur? modele? marque? km? prix? mel? P.ref? datesoumis? datevente? oui non
Encore une vue... Vue sur des voitures... CREATE VIEW VISIBLE AS SELECT modele,marque,km,prix,mel,p.ref, datesoumis FROM CLIENT C, Propose P, Annonce A, modele M WHERE C.login=P.login AND P.ref=A.ref AND A.IDmodele=M.IDmodele AND months between(datevente,sysdate) <1 Modifiable sur? modele? marque? km? prix? mel? P.ref? datesoumis? datevente? oui x x non x x x x x x
Donner des droits... Donner les droits en lecture à quelqu un... Donner à toto le droit de faire : SELECT * FROM VISIBLE??? Q10 A : GRANT SELECT ON VISIBLE TO toto With GRANT OPTION B : GRANT SELECT ON VISIBLE TO toto C : GRANT READ ON VISIBLE TO toto D : On ne peut pas donner de droit sur une vue
Donner des droits... Donner les droits en lecture à quelqu un... Donner à toto le droit de faire : SELECT * FROM VISIBLE grant SELECT on visible to toto;
Fonction... Compter les 206... Faire une fonction qui renvoie le nombre de 206 mises en vente sur le site.??? Premier point : Faut-il un curseur? Q11 Oui Non Peut-être?
Fonction... Compter les 206... CREATE FUNCTION Compte206 RETURN NUMBER IS nb206 NUMBER BEGIN SELECT COUNT(*) INTO nb206 FROM Propose P, Annonce A, Modele M WHERE A.ref = P.ref AND A.IdModele = M.IdModele AND M.modele = 206 ; RETURN nb206; END;
... et procédure Afficher les 206... Faire une procédure qui affiche les 206 mises en vente sur le site.??? Premier point : Faut-il un curseur? Q12 Oui Non Peut-être?
... et procédure Afficher les 206... CREATE PROCEDURE Affiche206 CURSOR les206 IS SELECT modele, km, annee, prix, datesoumis FROM Propose P, Annonce A, Modele M WHERE A.ref = P.ref AND A.IdModele = M.IdModele AND M.modele = 206 ; BEGIN DBMS OUTPUT.PUT LINE ( Voici les 206 : ); FOR une206 IN les206 LOOP DBMS OUTPUT.PUT LINE (une206.modele une206.km...); END LOOP; END;
Encore des fonctions... Compter les mouvements du jour Faire une fonction qui renvoie le nombre d annonces mises sur le site aujourd hui. Faire une fonction qui renvoie le nombre de ventes faites aujourd hui. Elargir à des fonctions qui prennent en paramètre la date.???
Paquetage Faire un paquetage de statistiques Faire un paquetage qui regroupent toutes ces fonctions et procédures de stats...???
Paquetage Faire un paquetage de statistiques: les spécifications CREATE PACKAGE Stats AS FUNCTION nb206 RETURN NUMBER; PROCEDURE affiche206;... END Statistiques ;
Paquetage Faire un paquetage de statistiques: le corps CREATE PACKAGE BODY Stats AS FUNCTION nb206 RETURN NUMBER nb206 NUMBER BEGIN SELECT COUNT(*) INTO nb206 FROM Propose P, Annonce A, Modele M WHERE A.ref = P.ref AND A.IdModele = M.IdModele AND M.modele = 206 ; RETURN nb206; END nb206; PROCEDURE affiche206... END affiche206; END Statistiques ;
Déclencheurs Faire un déclencheur... Faire un déclencheur qui affiche quand un client met plus de 10 annonces.??? Faire un déclencheur... Faire un déclencheur qui interdit à un client de mettre plus de 15 annonces.???
Déclencheurs Faire un déclencheur... CREATE TRIGGER avert10annon BEFORE INSERT ON Propose BEGIN nbloc NUMBER SELECT COUNT * INTO nb FROM Propose P WHERE login=old:login DBMS OUTPUT.PUT LINE( Plus de 10 annonces pour C.nom); END IF; END;