SQL avancé Correction



Documents pareils
TP Contraintes - Triggers

Langage SQL : créer et interroger une base

Le langage SQL Rappels

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

1 Introduction et installation

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Notes de cours : bases de données distribuées et repliquées

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

SQL Historique

Les bases de données

Administration des bases de données. Jean-Yves Antoine

Cours Bases de données 2ème année IUT

Devoir Data WareHouse

Le Langage SQL version Oracle

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

TP Bases de données réparties

Bases de Données relationnelles et leurs systèmes de Gestion

Bases de données et sites WEB

Cours Bases de données 2ème année IUT

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Bases de données avancées

Olivier Mondet

Intégrité des données

Introduction au Système de Gestion de Base de Données et aux Base de Données

Bases de données relationnelles

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

Bases de données et sites WEB Licence d informatique LI345

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Optimisation SQL. Quelques règles de bases

16H Cours / 18H TD / 20H TP

A QUOI SERVENT LES BASES DE DONNÉES?

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Introduction aux Bases de Données 2004/2005

Auto-évaluation Oracle: cours de base

COMPRENDRE LES DIFFERENTS TYPES DE CONNEXION LORS DE LA

MySQL / SQL EXEMPLES

Le langage SQL (première partie) c Olivier Caron

//////////////////////////////////////////////////////////////////// Administration bases de données

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

A QUOI SERVENT LES BASES DE DONNÉES?

TD n 10 : Ma première Base de Données

CREATION WEB DYNAMIQUE

TP3 : Creation de tables 1 seance

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Cours SQL. Base du langage SQL et des bases de données

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Gestion de stock pour un magasin

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Cours: Les Jointures 1

TP1 - Prise en main de l environnement Unix.

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

MODE OPERATOIRE OPENOFFICE BASE

Vincent Augusto

FileMaker 13. Guide de référence SQL

iil est désormais courant de trouver sur Internet un document

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Dossier I Découverte de Base d Open Office

1 Modélisation d une base de données pour une société de bourse

Encryptions, compression et partitionnement des données

Présentation du module Base de données spatio-temporelles

Mysql avec EasyPhp. 1 er mars 2006

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Manuel Viadeis CRM Connecteur intégration L100 étendue.

Gestion de base de données

Les déclencheurs. Version 1.0. Grégory CASANOVA

Historisation des données

SOMMAIRE. Travailler avec les requêtes... 3

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Créer le schéma relationnel d une base de données ACCESS

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Le Langage De Description De Données(LDD)

EXCEL TUTORIEL 2012/2013

PHP 5. La base de données MySql. A. Belaïd 1

Session S12 Les bases de l optimisation SQL avec DB2 for i

Pratique et administration des systèmes

CHAPITRE 1 ARCHITECTURE

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Gestion des utilisateurs et de leurs droits

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Du 10 Fév. au 14 Mars 2014

BTS/CGO P10 SYSTEME INFORMATION Année

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Transcription:

SQL avancé Correction 1 Base Cinéma étendue (modèle logique de données et modèle relationnel) Nous utiliserons lors de ce TD une extension de la base Cinéma. Le modèle logique de données (MLD) et le modèle relationnel (MR) de cette base sont les suivants. 1.1 Modèle logique de données (schéma entité-association) 1.2 Modèle relationnel Les clés primaires sont soulignées avec une ligne droite, les clés étrangères sont soulignées avec des vagues. 1

ACTEUR (NUMERO ACTEUR, NOM ACTEUR, PRENOM ACTEUR, NATION ACTEUR, DATE DE NAISSANCE) ROLE ( NUMERO ACTEUR, NUMERO FILM, NOM DU ROLE) FILM (NUMERO FILM, TITRE FILM, DATE DE SORTIE, DUREE, GENRE, NUMERO REALISATEUR) REALISATEUR (NUMERO REALISATEUR, NOM REALISATEUR, PRENOM REALISATEUR, NATION REALISATEUR) SEANCE (NUMERO SEANCE, NUMERO FILM, CATEGORIE DE LA SEANCE, DATE DE LA SEANCE, HORAIRE) CATEGORIE SEANCE (CATEGORIE DE LA SEANCE, TYPE SEANCE) RESERVATION ( NUMERO SEANCE, NUMERO PLACE, NOM SPECTATEUR) PLACE (NUMERO PLACE, CATEGORIE DE LA PLACE) CATEGORIE PLACE (CATEGORIE DE LA PLACE, TYPE PLACE) TARIF ( CATEGORIE DE LA PLACE, CATEGORIE DE LA SEANCE, PRIX) 2 SQL : configuration (Rappels) 2.1 Récupération des fichiers utiles pour le TD Créez un dossier de travail, téléchargez-y l archive disponible à l adresse http://uuu.enseirb.fr/~fouresti/ enseignement/enseirb/sqlav/sqlav.tar et décompressez la. Par exemple : 1 $ mkdir <d o s s i e r d e t r a v a i l > && cd <d o s s i e r d e t r a v a i l > $ wget http : / / uuu. e n s e i r b. f r / f o u r e s t i / enseignement / e n s e i r b / s q l a v / s q l a v. t a r 3 $ t a r xvf s q l a v. t a r 2.2 Connexion Afin de pouvoir se connecter à la base, il faut définir plusieurs variables d environnement. Pour les définir automatiquement, ajoutez les lignes suivantes à la fin du fichier ~/.bash_export (pour gagner du temps, ces lignes peuvent être copiées à partir du fichier config_oracle) : 1 export ORACLE BASE=/opt / o r a c l e /app/ o r a c l e export ORACLE HOME=$ORACLE BASE/ product / 1 1. 1. 0 / db 1 3 export ORACLE SID=e c o l e export PATH=$ORACLE HOME/ bin :$PATH 5 unset TWO TASK Remarque 2.1. Lorsque que l on se connecte à oracle avec ssh, le fichier ~/.bashrc (qui s exécute habituellement lorsque l on démarre une console) n est pas exécuté, c est le fichier ~/.bash_profile qui est exécuté à la place. Comme les fichiers ~/.bashrc et ~/.bash_profile contiennent tous les deux la ligne suivante : 1. ${HOME} /. bash export Ils executent tous les deux le fichier ~/.bash_export. Ainsi ajouter les lignes permettant de définir les variables d environnement à la fin du fichier ~/.bash_export permet d être sûr qu elles soient définies à la fois lorsque l on ouvre une nouvelle console ou lorsque l on se connecte en ssh. Pour pouvoir se connecter à la base, il faut se connecter à la machine qui héberge la base : oracle. 1 $ ssh X o r a c l e $ cd <d o s s i e r d e t r a v a i l > Vous pouvez maintenant vous connecter à la base en exécutant la commande suivante : $ s q l p l u s Un nom d utilisateur et un mot de passe vous sont demandés. Par défaut, ils sont tous les deux égaux à votre login de l ENSEIRB. Une fois connecté, un invite de commande apparaît. Pour quitter l invite de commande, il faut utiliser le raccourci <CTRL-D> ou la commande exit. Exécutez la commande suivante pour modifiez votre mot de passe d accès à la base : 1 SQL> alter user <n o m u t i l i s a t e u r > identified by <nouveaumotdepasse > ; 2

2.3 Utilisation de sqlplus En plus de l exécution directe de commandes SQL, sqlplus permet d exécuter un fichier sql entier en utilisant le préfixe @. Ainsi, pour exécuter le fichier test.sql, il faut écrire : 1 SQL> @test Écrire des commandes SQL directement à l invite de commande est peu commode. Je vous conseille d utiliser votre éditeur de texte favori pour éditer les commandes, puis de les sélectionner pour les copier, et enfin de cliquer sur le bouton du milieu de la souris pour les coller dans la console où il y a l invite de commande. Remarque 2.2. Il est possible d augmenter le nombre de caractères affichés par ligne grâce à la commande suivante : 1 SQL> set l i n 150 l e s l i g n e s f e r o n t 150 c a r a c t è r e s max SQL> set wrap o f f on a c t i v e l a t r o n c a t u r e des l i g n e s 2.4 Création de la base Cinéma étendue Nous allons maintenant créer la base Cinéma étendue. Celle-ci sera utilisée dans la suite du TD pour réaliser des requêtes. 1. Lisez rapidement le fichier de création des tables : base_etendue.sql et le fichier d ajout des données : donnees_etendue.sql. 2. Exécutez ces fichiers. SQL> @ base etendue 2 SQL> @ donnees etendue 3. Affichez la description de la table SEANCE pour vous assurer que la création de la base a bien eu lieue : SQL> desc seance 3 SQL : requêtes (rappels) Voici quelques rappels de syntaxe (un mot entre crochet est facultatif, lorsque il y a des accolades, il faut choisir un mot au choix) : 1 select select [ distinct ] expr [ as a l i a s ], expr [ as a l i a s ]... 3 from { t a b l e vue} [ a l i a s ], { t a b l e vue} [ a l i a s ]... [ where c o n d i t i o n ] 5 [ group by expr ] r e q u ê t e s de regroupements [ having c o n d i t i o n ] c o n d i t i o n sur l e s groupes 7 [ { union intersect minus} r e q u ê t e ] o p é r a t i o n e n s e m b l i s t e s [ order by { expr posn } [ { asc desc } ], 9 { expr posn } [ { asc desc } ],... ] t r i s 11 insert insert into { t a b l e vue} [ ( col1,..., c o l n ) ] 13 {values ( val1,..., valn ) r e q u ê t e } 15 delete delete [ from ] { t a b l e vue} 17 [ where c o n d i t i o n ] 19 update update { t a b l e view } [ as a l i a s ] 21 set colonne = expr, [ colonne = expr ]... [ where c o n d i t i o n ] Écrivez en SQL les requêtes permettant de répondre aux demandes suivantes (les résultats devant être obtenus sont affichés sous questions afin de vous permettre de valider vos solutions). 3

1. Les dates des séances (sans répétition) des films dans lesquels l acteur numéro 1 joue. select distinct DATE DE LA SEANCE 2 from SEANCE S, FILM F, ROLE R where R.NUMERO FILM = F.NUMERO FILM 4 and S.NUMERO FILM = F.NUMERO FILM and R.NUMERO ACTEUR = 1 ; 1 24 MAY 96 23 MAY 96 2. Les noms des rôles de l acteur numéro 4 triées par ordre alphabétique. select distinct NOM DU ROLE 2 from ROLE where NUMERO ACTEUR = 4 4 order by NOM DU ROLE; MARIE PIERRE 3. Les dates et les horaires des séances du film numéro 7 triées par ordre décroissant selon les dates et croissant selon les horaires. 1 select DATE DE LA SEANCE, HORAIRE from SEANCE S 3 where S.NUMERO FILM = 7 order by 1 desc, 2 ; 24 MAY 96 14 2 24 MAY 96 20 23 MAY 96 16 4 23 MAY 96 18 23 MAY 96 22 4. Le nombre d acteurs. 1 select count ( ) from ACTEUR; 35 5. Le titre des films projetés pendant exactement deux séances. 1 select F. TITRE FILM from FILM F, SEANCE S 3 where F.NUMERO FILM = S.NUMERO FILM group by F.NUMERO FILM, F. TITRE FILM 5 having count ( ) = 2 ; 1 TITRE FILM 3 37 2 LE MATIN EXODUS 4 Jointures Jusqu à maintenant, les jointures était réalisées au moyen d une clause du type : 4

[... ] 2 where TABLE1. CLE PRIMAIRE = TABLE2. CLE SECONDAIRE [... ] Il s agit en fait d une des syntaxes permettant de réaliser une jointure interne. Dans cette section, nous étudions les différents types de jointures et les syntaxes associées. 4.1 Jointures internes Le résultat des jointures internes peut être défini comme la réalisation d un produit cartésien 1 entre tous les enregistrements des tables puis le retrait de toutes les lignes qui ne satisfont pas le prédicat de jointure (lorsque l on utilisait la syntaxe avec un WHERE, on utilisait un prédicat d égalité : TABLE1.CLE PRIMAIRE = TABLE2.CLE SECONDAIRE). Figure 1 Jointure interne : avec un prédicat d égalité, le résultat obtenu est l intersection des ensembles associés aux tables (équi-jointure). 4.1.1 Équi-jointure On parle d équi-jointure lorsque le prédicat de jointure contient l opérateur de comparaison = 2. La syntaxe dédiée est la suivante : 1 select from REALISATEUR inner join FILM 3 on REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; 20 rows s e l e c t e d. ou : select 2 from REALISATEUR inner join FILM using (NUMERO REALISATEUR) ; Le résultat sera le même qu avec : 1 select from REALISATEUR, FILM 3 where REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; Remarque 4.1. Il est préférable d utiliser la première syntaxe (inner join) à la place du where car l on assure le SGBD que l on veut faire un jointure (alors que le where peut aussi correspondre à une sélection). Le SGBD sera ainsi plus à même d utiliser un algorithme de jointure optimisé. Remarque 4.2. La syntaxe en inner join avec using, ne permet pas d utiliser les alias, il est donc préférable d utiliser la syntaxe avec on. Voici un exemple d usage des alias avec cette syntaxe : 1. Le produit cartésien de deux tables est obtenu en associant tous les enregistrements de la seconde table à chacun des enregistrements de la première. On obtient donc nombre ligne table1 nombre ligne table2 lignes dans la table résultat. 2. Lorsque l on utilise un opération de comparaison différente (ex : ), l on parle de théta-jointures. 5

1 select from REALISATEUR R inner join FILM F 3 on R.NUMERO REALISATEUR = F.NUMERO REALISATEUR; Remarque 4.3. Pour réaliser des jointures entre plus de deux tables, il faut utiliser des parenthèses : 1 select from (REALISATEUR R inner join FILM F 3 on R.NUMERO REALISATEUR = F.NUMERO REALISATEUR) inner join ROLE RO 5 on F.NUMERO FILM = RO.NUMERO FILM; 4.1.2 Jointure naturelle Les jointures naturelles sont en fait des équi-jointures où la colonne utilisée pour réaliser la jointure n est pas précisée 3 : toutes les colonnes des deux tables ayant le même nom sont utilisées pour réaliser la jointure. La syntaxe est la suivante : 1 select from REALISATEUR natural join FILM ; [... ] 2 20 rows s e l e c t e d. Remarque 4.4. L erreur ORA-25155: column used in NATURAL join cannot have qualifier est renvoyée par Oracle lorsque le choix automatique des colonnes utilisées pour la jointure est ambigu. Pour ne pas avoir ce type de problème, le mieux est de spécifier à chaque fois la colonne à utiliser pour réaliser la jointure (et donc d utiliser un inner join). Remarque 4.5. Depuis la version 11g d Oracle, il n est plus possible de faire des projections explicites de la clé : select FILM.NUMERO REALISATEUR 2 from REALISATEUR natural join FILM ; ERROR at l i n e 1 : 2 ORA 25155: column used i n NATURAL j o i n cannot have q u a l i f i e r select NUMERO REALISATEUR 2 from REALISATEUR natural join FILM ; [... ] 2 20 rows s e l e c t e d. 4.2 Jointures externes Une jointure externe n a pas besoin que chaque ligne aient une valeur commune : la(les) table(s) avec laquelle l on réalise la jointure conservera(ont) toutes ses(leurs) lignes, Les colonnes pour lesquelles il n y a pas de correspondance sont remplies avec la valeur NULL. On parle de jointure externe gauche, droite ou complète en fonction des tables dont on conservera toutes les lignes. 3. On parle de jointure implicite. 6

4.2.1 Jointure externe gauche La syntaxe est la suivante : select 2 from REALISATEUR l e f t outer join FILM on REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; 22 rows s e l e c t e d. Toutes les lignes de la table de gauche sont conservées, celle de la table de droite ne sont conservées que si elles correspondent à une ligne de la table de gauche. Figure 2 Jointure externe gauche avec prédicat d égalité. 4.2.2 Jointure externe droite La syntaxe est la suivante : select 2 from REALISATEUR r i g h t outer join FILM on REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; 21 rows s e l e c t e d. C est l inverse de la jointure externe gauche : on prend la table de droite comme référence. C est donc équivalent à : select 2 from FILM l e f t outer join REALISATEUR on REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; En pratique, seule la notation left outer join est utilisée afin de gagner en lisibilité dans le code. 4.2.3 Jointure externe complète La table résultat conserve les lignes des deux tables en complétant au besoin par NULL. La syntaxe est la suivante : 1 select from FILM f u l l outer join REALISATEUR 3 on REALISATEUR.NUMERO REALISATEUR = FILM.NUMERO REALISATEUR; 23 rows s e l e c t e d. 7

Figure 3 Jointure externe complète. 4.3 Auto-jointure On parle d auto-jointure lorsque l on réalise une jointure entre deux instances d une même table. Par exemple : select P.NUMERO ACTEUR, P.NOM ACTEUR, S.NUMERO ACTEUR, S.NOM ACTEUR 2 from ACTEUR P, ACTEUR S where P.NATION ACTEUR = S.NATION ACTEUR 4 and P.NUMERO ACTEUR < S.NUMERO ACTEUR order by P.NUMERO ACTEUR, P.NOM ACTEUR, S.NUMERO ACTEUR, S.NOM ACTEUR; 3 NUMERO ACTEUR NOM ACTEUR NUMERO ACTEUR NOM ACTEUR 5 33 DALLE 35 RIVIERE 34 ANGLADE 35 RIVIERE 7 354 rows s e l e c t e d. P et S sont des alias vers deux copies de la table ACTEUR. La condition P.NATION ACTEUR = S.NATION ACTEUR permet de ne conserver que les pairs d acteur ayant la même nationalité. La condition P.NUMERO ACTEUR < S.NUMERO ACTEUR permet de ne pas avoir de doublons. 4.4 Exercices Écrivez en SQL les requêtes permettant de répondre aux demandes suivantes. 1. Pour les tables ACTEUR et ROLE. (a) La jointure interne. select 2 from ACTEUR A inner join ROLE R on A.NUMERO ACTEUR = R.NUMERO ACTEUR; 3 40 rows s e l e c t e d. (b) La jointure externe gauche. 1 select from ACTEUR A l e f t outer join ROLE R 3 on A.NUMERO ACTEUR = R.NUMERO ACTEUR; 3 41 rows s e l e c t e d. 8

2. Les noms et prénoms des réalisateurs qui ont travaillé avec l acteur DUBOIS (en utilisant les nouvelles syntaxes pour les jointures). 1 s e l e c t R. NOM REALISATEUR, R.PRENOM REALISATEUR from ( (REALISATEUR R inner join FILM F 3 on R.NUMERO REALISATEUR = F.NUMERO REALISATEUR) inner join ROLE RO 5 on F.NUMERO FILM = RO.NUMERO FILM) inner join ACTEUR A 7 on RO.NUMERO ACTEUR = A.NUMERO ACTEUR where A.NOM ACTEUR = DUBOIS ; NOM REALISATEUR PRENOM REALISATEUR 2 SAUTET CLAUDE 3. Le classement des acteurs selon le nombre de rôle réalisés (en classant en dernier les acteurs n ayant pas réalisés de rôles). 1 s e l e c t A.NOM ACTEUR, A.PRENOM ACTEUR, count (R.NUMERO FILM) as NOMBRE from ACTEUR A l e f t outer join ROLE R 3 on A.NUMERO ACTEUR = R.NUMERO ACTEUR group by A.NOM ACTEUR, A.PRENOM ACTEUR, A.NUMERO ACTEUR 5 order by NOMBRE desc ; Il est important de spécifier R.NUMERO FILM dans le count car un count(*) compterai le nombre de ligne et ne renverrai pas 0 pour les acteurs ayant n ayant pas joué dans des films (ce comportement de count peut varier en fonction des implantations). 3 NOM ACTEUR PRENOM ACTEUR NOMBRE 5 CLUZET FRANCOIS 1 ROBERT YVES 0 7 35 rows s e l e c t e d. 5 Vues Les vues sont des images partielles de la base de données. Elles proposent une vision logique des données contenues dans une ou plusieurs tables. Une vue est considérée comme une table virtuelle, sa description est stockée sous la forme d une requête, aucune donnée ne lui est associée. Utilité : Confidentialité : On peut n autoriser pour les utilisateurs que d accéder aux vues. Cacher la complexité des données aux utilisateurs : vue simplifiée des données, simplifier les requêtes complexes. Présenter différentes perspectives sur les données. Syntaxe : create [ or replace ] view nom vue [ ( nouveaux nom colonne1, 2 nouveaux nom colonne2, e t c ) ] as sous r e q u ê t e 4 [ with check option [ constraint nom contrainte ] ] [ with read only ] ; or replace : remplace une vue existante. with read only : interdit les modifications. with check option : contraintes d intégrité à respecter lors de l insertion ou de la modification d une ligne. 9

5.1 Exercices 1. Réaliser une vue contenant pour chaque acteur le nombre de séance où l on a pu voir des films dans lequel il a participé. Afficher le contenu de la vue. 1 create view NOMBRE SEANCES (NOM, PRENOM, SEANCES) as select A.NOM ACTEUR, A.PRENOM ACTEUR, count ( S.NUMERO SEANCE) 3 from ( (ACTEUR A inner join ROLE R on A.NUMERO ACTEUR = R.NUMERO ACTEUR) 5 inner join FILM F on R.NUMERO FILM = F.NUMERO FILM) 7 inner join SEANCE S on F.NUMERO FILM = S.NUMERO FILM 9 group by A.NOM ACTEUR, A.PRENOM ACTEUR, A.NUMERO ACTEUR; 1 select from NOMBRE SEANCES; 1 View c r e a t e d. NOM PRENOM SEANCES 3 [... ] 5 BOURVIL BOURVIL 10 NEWMAN PAUL 2 7 10 rows s e l e c t e d. 6 Déclencheurs Un déclencheur (trigger en anglais) est activé par un événement : insertion, suppression ou modification sur une table. Lorsqu un déclencheur est activé, une condition est évaluée. Si la condition est vraie, l action est exécutée : insertion, suppression ou modification de la base de données. Utilité : Maintenir les contraintes d intégrité. Calculer des valeurs dérivées. Syntaxe : create [ or replace ] trigger NOM TRIGGER 2 { before after instead of } insert update delete 4 [ of nom d a t t r i b u t 1, nom d a t t r i b u t 2, e t c ] on NOM TABLE 6 [ for each row [when ( c o n d i t i o n ) ] ] 8 begin <b l o c SQL, PL/SQL, programme Java ou C> 10 end ; / Attention à ne pas o u b l i e r l e / Le langage PL/SQL est une extension de SQL propre à Oracle. or replace : remplace un déclencheur existant. before, after, instead of : executer l action avant, après ou à la place de l événement déclencheur. for each row [when (condition)] : vérifier la condition sur toutes les lignes de la table. L événement déclencheur (par exemple un update) peut toucher plusieurs lignes à la fois. Suivant l objectif du déclencheur, on peut souhaiter qu il s exécute une seule fois, même si l update auquel il répond touche 10 lignes, ou bien vouloir qu il s exécute autant de fois qu il y a de lignes touchées par l update. La clause for each row permet de traiter ce second cas. 10

Exemple : 1 create trigger MAJ LOG after update on PAYS 3 for each row when (new.surface <> old.surface) 5 begin insert into PAYS LOG (NOM, LIBELLE) 7 values (new.nom, s u r f a c e c h a n g é e ) ; end ; 9 / old et new sont des versions de la table sur laquelle agit les déclencher. Le contenu de ces tables dépend de l événement du déclencheur : Type old new insert NULL Valeur créée delete Valeur avant suppression NULL update Valeur avant modification Valeur après modification En cas de problème de compilation, la commande suivante permet d afficher les erreurs : 1 show errors trigger NOM TRIGGER; Remarque 6.1. Les déclencheurs sont des cas particuliers des procédures stockées. Une procédure stockée est un ensemble d instructions pré-compilées, stockées sur le serveur, directement dans la base de données. Ces instructions sont écrites dans une extension du langage SQL propre à chaque SGBD (PL/SQL en Oracle), ainsi il faut autant que possible ne pas les utiliser afin de garder un système portable. Les procédures stockées répondent à ce problème : une requête n est envoyée qu une fois sur le réseau puis analysée, interprétée et stockée sur le serveur sous forme exécutable (pré-compilée). Pour qu elle soit exécutée, le client n a qu à envoyer une requête comportant le nom de la procédure stockée avec si besoin des paramètres et il recevra le résultat comme si c était une requête SQL classique. Intérêts : Simplification : code plus simple à comprendre. Rapidité : moins d informations sont échangées entre le serveur et le client. Performance : économise au serveur l interprétation de la requête car elle est précompilée. Sécurité : les applications et les utilisateurs n ont aucun accès direct aux tables, mais passent par des procédures stockées prédéfinies. 6.1 Exercices 1. Écrire un déclencheur qui lorsque l on réalise une réservation sur la place n o 1, le fait puis change la catégorie de la place en categorie speciale (cf. le fichier donnees_etendue.sql). Vérifier le fonctionnement du déclencheur. 1 create or replace trigger RESA SPECIALE after insert on RESERVATION 3 for each row when (new.numero PLACE = 1) 5 begin update PLACE 7 set CATEGORIE DE LA PLACE = S where NUMERO PLACE = 1 ; 9 end ; / 11 show errors trigger RESA SPECIALE ; 1 T r i g g e r c r e a t e d. 11

1 1 row c r e a t e d. 1 NUMERO PLACE C 3 1 S 7 Optimisation Sous Oracle, il est possible de visualiser les traces d exécution : 1 d o l l a r s q l p l u s f o u r e s t i / f o u r e s t i SQL> set a u t o t r a c e on e x p l a i n s t a t 3 SQL> select s y s d a t e from dual ; [... ] 5 Execution Plan 7 Plan hash value : 1546270724 [... ] En pratique, un moyen d optimiser les requêtes et de faire les sélections les plus tôt possible. Pourquoi? Vérifiez sur une requête de votre choix. 8 Transactions 8.1 Définitions Définition 8.1. Une transaction est une séquence de requêtes SQL qui est exécuté en une seule fois. Une transaction doit respecter les propriétés ACID : Définition 8.2. Les propriétés ACID sont les suivantes : Atomicité : une transaction doit être soit complètement exécuté soit complètement annulée. Cohérence : une transaction ne doit pas laisser la base de données dans un état incohérent. Isolation : une transaction ne doit pas voir aucune autre transaction en cours d exécution. Durabilité : après que le client a été informé du succès de la transaction, les résultats de celle-ci ne disparaîtront pas. Définition 8.3. Le verrouillage à deux phases est un protocole spécifiant une procédure possible pour exécuter les transactions en respectant les propriétés ACID. Définition 8.4. Une estampille permet d identifier de façon unique une transaction et elle est créée avant l exécution de la transaction. En pratique, les estampilles sont calculées à partir de la date de début de la transaction ou d un compteur. 8.2 Pratique 1. Effectuez successivement les opérations suivantes. (a) Affichez toutes les réservations. (b) Insérez une réservation. insert into RESERVATION values (1, 1, un s p e c t a t e u r ) ; (c) Affichez toutes les réservations. (d) Tapez l instruction commit;. (e) Affichez toutes les réservations. (f) Insérez une nouvelle réservation. 12

(g) Affichez toutes les réservations. (h) Tapez l instruction rollback;. (i) Affichez toutes les réservations. (j) Concluez! L insertion est effectuée dans la base de données mais peut être défaite définitivement par un rollback ou bien devient effective de manière permanente par un commit : propriété de durabilité des transactions. 2. Lancez une seconde session sqlplus et procédez comme suit. (a) Insérez une réservation dans cette seconde session. La réservation est créée dans la seconde session. (b) Affichez cette même réservation pour chacune des deux sessions. Commentez! La réservation n apparaît que dans la seconde session (et pas dans la première) ; propriété d isolation des transactions. (c) Insérez cette même réservation dans la première session. Que se passe-t-il dans cette première session? La première session est bloquée sur cette insertion ce qui suppose un mécanisme de verrouillage des enregistrements (par exemple : l utilisation de mutex). (d) Effectuez un rollback dans la seconde session. La seconde session défait l insertion et termine sa transaction, et ainsi débloque la première session qui peut alors effectuer son insertion. (e) Affichez cette même réservation pour chacune des deux sessions. La réservation n apparaît que dans la première session (et non dans la seconde). (f) Effectuez un commit dans la première session. La seconde session valide définitivement la réservation. (g) Affichez cette même réservation pour chacune des deux sessions. La réservation apparaît dans les deux sessions. (h) Concluez! Les sessions ne voient que leurs propres mises à jour tant que les autres transactions ne sont pas achevées (validées ou invalidées). De plus, en cas d accès concurrents, le dernier arrivé est mis en attente. 3. Effectuez successivement les opérations suivantes. (a) Modifiez une réservation R1 dans la première session. 1 update RESERVATION set NOM SPECTATEUR = un s p e c t a t e u r 3 where NUMERO SEANCE = 1 and NUMERO PLACE = 1 ; La réservation R1 est modifiée dans la première session. (b) Modifiez une réservation R2 dans la seconde session. La réservation R2 est modifiée dans la seconde session. (c) Modifiez la réservation R1 dans la seconde session. La seconde session est bloquée sur la modification de la réservation R1. (d) Modifiez la réservation R2 dans la première session. La demande de la modification de la réservation R2 par la première session est annulée par Oracle suite à la détection d un interblocage d où le message d erreur ORA-00060: deadlock detected while waiting for resource. On est donc ramené à la même situation que dans l exercice précédent. (e) Effectuez un rollback dans la première session. La première session défait son travail (uniquement sur la réservation R1), termine sa transaction et ainsi débloque la seconde session qui modifie alors la réservation R1. (f) Effectuez un rollback dans la seconde session. La seconde session défait son travail (sur les réservations R2 et R1) et termine sa transaction. (g) Concluez! Oracle a un mécanisme de détection (et de résolution) d interblocage. (h) Fermez la seconde session sqlplus. 13

8.3 Bonus : Procédure stockées Cette partie est une partie bonus! Elle aborde les procédures stockées qui n ont été que survolées lors d une remarque. N hésitez pas à lire de la documentation sur internet pour en savoir plus... 1. Effectuez successivement les opérations suivantes. (a) Exécutez le fichier procedure-declencheur.sql. (b) Choisissez une nouvelle réservation. SQL> s e l e c t from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 1 ; 2 no rows s e l e c t e d i. Insérez cette réservation. insert into RESERVATION values (1, 1, un s p e c t a t e u r ) ; 2 1 row c r e a t e d. ii. Affichez cette réservation. SQL> s e l e c t from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 1 ; 2 NUMERO SEANCE NUMERO PLACE NOM SPECTATEUR 4 1 1 un s p e c t a t e u r iii. Tapez l instruction sqlplus execute INSER 1 RESA OBLIG(a,b); où a est le numéro de séance et b le numéro de place de cette réservation. SQL> execute INSER 1 RESA OBLIG ( 1, 1 ) ; 2 PL/SQL procedure s u c c e s s f u l l y completed. iv. Supprimez cette réservation. SQL> delete from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 1 ; 2 1 row d e l e t e d. v. Affichez cette réservation. SQL> s e l e c t from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 1 ; 2 no rows s e l e c t e d vi. Tapez l instruction sqlplus execute INSER 1 RESA OBLIG(a,b);. Commentez! SQL> execute INSER 1 RESA OBLIG ( 1, 1 ) ; 2 PL/SQL procedure s u c c e s s f u l l y completed. Que l enregistrement existe (cas précédent) ou non (cas actuel), même résultat! vii. Effectuez un rollback. SQL> r o l l b a c k ; 2 Rollback complete. (c) Choisissez au hasard l une des réservations suivantes, avec pour (numéro de séance, numéro de place) l une des valeurs (1,8) (1,64) (1,128) (2,16) (2,32) (2,33) (2,64) (2,128) (2,256) (2,512) (5,32) (5,64) (8,256) (10,2) (10,4) (10,8) (10,16) (10,32) (10,64) (10,128) (10,129) (10,256) (10,512) (10,513) (12,8) (12,32) (12,64) (12,128) (15,8) (15,16) (15,17) (15,128) (15,256) (16,128) (16,512) (17,16) (17,32) (17,64) (20,16) (20,64) (20,128) (20,256). (1,8) i. Affichez cette réservation. SQL> s e l e c t from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 8 ; 2 NUMERO SEANCE NUMERO PLACE NOM SPECTATEUR 4 1 8 LAURENCE 14

ii. Essayez de supprimer cette réservation. Commentez! SQL> delete from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 8 ; 2 delete from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 8 4 ERROR at l i n e 1 : ORA 20000: c e t t e r e s e r v a t i o n e s t o b l i g a t o i r e : vous ne pouvez pas l a supprimer 6 ORA 06512: at LOGIN. INSER 1 RESA OBLIG, l i n e 48 ORA 06512: at LOGIN.AVANT SUPPR RESA OBLIG, l i n e 2 8 ORA 04088: e r r o r during e x e c u t i o n of trigger LOGIN.AVANT SUPPR RESA OBLIG L enregistrement ne peut visiblement pas être supprimé! Le déclencheur AVANT SUPPR RESA OBLIG apparaît en plus de la procédure INSER 1 RESA OBLIG. iii. Affichez cette réservation. Concluez! SQL> s e l e c t from RESERVATION where NUMERO SEANCE = 1 and NUMERO PLACE = 8 ; 2 NUMERO SEANCE NUMERO PLACE NOM SPECTATEUR 4 1 8 LAURENCE L enregistrement n a effectivement pas été supprimé! iv. Effectuez un rollback. SQL> r o l l b a c k ; 2 Rollback complete. v. Tapez l instruction sqlplus execute INSER 1 RESA OBLIG(a,b); où (a,b) est la valeur que vous avez choisie pour cette réservation. Commentez! SQL> execute INSER 1 RESA OBLIG ( 1, 8 ) ; 2 begin INSER 1 RESA OBLIG ( 1, 8 ) ; end ; 4 ERROR at l i n e 1 : ORA 20000: c e t t e r e s e r v a t i o n e s t o b l i g a t o i r e : vous ne pouvez pas l a supprimer 6 ORA 06512: at LOGIN. INSER 1 RESA OBLIG, l i n e 48 ORA 06512: at l i n e 1 Cette procédure a donc été appelée lors de la suppression. Références [1] Join (SQL) - Wikipedia, the free encyclopedia, http://en.wikipedia.org/wiki/join_(sql) [2] SQL joins are easy, http://www.halfgaar.net/sql-joins-are-easy [3] SQL join types, http://www.gplivna.eu/papers/sql_join_types.htm [4] A Visual Explanation of SQL Joins, http://www.codinghorror.com/blog/archives/000976.html [5] INNER JOINs, http://developer.mimer.com/documentation/html_92/mimer_sql_engine_docset/ search_join4.html [6] Better Alternatives to a FULL OUTER JOIN, http://weblogs.sqlteam.com/jeffs/archive/2007/04/19/ Full-Outer-Joins.aspx [7] Christelle Vangenot : Vues et Triggers, http://lbdwww.epfl.ch/f/teaching/courses/slidesbdr/vues_ triggers.pdf [8] Robert Laurini : Triggers, http://lisi.insa-lyon.fr/~laurini/3if-sql-pdf/5.pdf [9] Arash Partow ; Simple Database Algorithms, http://www.partow.net/programming/databasealgos/ index.html [10] Nested Loop, Merge Join, and Hash Join algorithm, http://geeks.netindonesia.net/blogs/kasim.wirama/ archive/2008/05/18/nested-loop-merge-join-and-hash-join-algorithm.aspx 15

[11] CS143 : Query processing and join algorithms, http://oak.cs.ucla.edu/cs143/notes/join.pdf [12] CS143 Notes : TRANSACTION, http://oak.cs.ucla.edu/cs143/notes/transaction.pdf [13] Propriétés ACID - Wikipédia, http://fr.wikipedia.org/wiki/proprits_acid [14] Bertrand Le Saëc : Accès concurrents. [15] LES TRANSACTIONS CONCURRENTES, http://perso.telecom-paristech.fr/~talel/cours/inf225/ wwwbd/cours/transactions/cours/cours_bd.html 16