====== SGBD ====== TP de SGBD par Nacer Boudjlida * {{:ens:2012-tp1-sqlplus-ci.pdf|TP1}} * {{:ens:2012-sgbd-tp-transactions.pdf|TP2}} * {{:ens:2012-sgbd-tp3.pdf|TP3}} ====== Corrigé ====== Bonjour, ci-joints des éléments de corriger des TPs, essentiellement contraintes d'intégrité et droits d'accès, les TPs sur les transactions et sur le traitement des requêtes ne posant pas, à mon avis, de difficultés particulières. Pour le TP sur le traitement des requêtes, il s'agissait essentiellement d'interroger la plan_table et de voir 1) que des formes différentes de requêtes donnaient le même plan 2) que des informations sur les coûts n'apparaissent pas tant qu'on n'a pas collecté les statistiques (analyze table (ou index) XXX compute statistics) N. Boudjlida PS: Les solutions proposées sont amplement "optimisables" {{:ens:1-tp1-ci-2011-corrige.pdf|Fichier PDF }} ====== Corrigé du TP noté ====== create table avion as select * from nacerb.avion; create table pilote as select * from nacerb.pilote; create table vol as select * from nacerb.vol; -- Contrainte facile trigger accepté alter table pilote add constraint inf_50 check (prime <= 50); -- Ajout de la prime alter table pilote add primeincluse number(10,2); -- Version simple before insert or update of prime,salaire on pilote for each row begin :new.primeincluse := (:new.salaire*(:new.prime+100))/100; end; / -- verion deux parties create global temporary table prime_salaire_tmp (numPilote integer); create or replace trigger prime_salaire before insert or update of prime, salaire on pilote for each row begin insert into prime_salaire_tmp values (:new.numPil); end; / create or replace trigger prime_salaire2 after insert or update of prime, salaire on pilote begin update pilote set primeincluse=(salaire*(prime+100))/100 where numPil in (select numPilote from prime_salaire_tmp); delete from prime_salaire_tmp; end; / -- version moche create or replace trigger prime_salaire after insert or update of prime, salaire on pilote begin update pilote set primeincluse=(salaire*(prime+100))/100; end; / -- Question 4 create view les_primes as select numPil, nomPil,prime from pilote; -- Question 5 Select * from user_updatable_columns where table_name = 'LES_PRIMES'; OWNER TABLE_NAME COLUMN_NAME UPD INS DEL ------------------------------ ------------------------------ ------------------------------ --- --- --- ETUDXXX LES_PRIMES NUMPIL YES YES YES ETUDXXX LES_PRIMES NOMPIL YES YES YES ETUDXXX LES_PRIMES PRIME YES YES YES -- vue updatable donc pas besoin de trigger. update les_primes set prime = 30 where numPil=7; -- commit; -- Mot magique -- Si vous voulez absolument un trigger pour updater la prime de la vue create or replace trigger v_primes_update instead of update on les_primes for each row begin update pilote set prime=:new.prime where numpil=:new.numpil; end ; / -- Question 6 -- d'après le cours c'est : select table_name,privilege,grantor from user_tab_privs_recd; ====== Outil ====== Rlwrap permet d'ajouter l'historique et l'édition d'une ligne dans oracle. lancer sql avec rlwrap sqlplus {{:ens:rlwrap.gz|}}