Bases de données
Eléments de bases de données : Les entités faibles et les identifiants relatifs Le LDD (Langage de définition de données) La gestion de privilèges
Les vues
Les opérateurs ensemblistes La division SQL Les triggers (ou déclencheurs)
1 Ph. CHOCHOIS
Concept d'entité faible
Dans le modèle conceptuel, une entité représente un objet de gestion de l'organisation concernée. L'entité a donc une existence propre.
Dans la réalité, cette notion n’est pas toujours vraie. Certaines entités dépendent d’autres entités.
Exemple: Un immeuble et les salles qui le composent.
Page 2
Une salle n‘a pas d’existence propre. Elle n’existe seulement parce que l’immeuble existe.
Entité faible Entité forte
Concept d'entité faible
Règles de détermination des entités faibles:
L’entité faible n’existe que s’il y a présence d’une entité forte. La disparition de l’entité forte entraîne obligatoirement la disparition de l’entité faible.
La suppression d’occurrences de l’entité forte entraîne automatiquement la suppression des occurrences de l’entité faible qui lui étaient associées.
L’entité faible ne peut exister que s’il y a dépendance fonctionnelle forte et stable.
Dépendance fonctionnelle: L’entité faible est associé à une seule entité forte. La cardinalité maximale entre l’entité faible et l’association est à 1. Une salle n’est située que dans un immeuble.
Dépendance fonctionnelle forte: La cardinalité minimale est à 1. Une salle ne peut pas ne pas être située dans un immeuble.
Dépendance fonctionnelle stable: L’association entre 2 occurrences des entités ne peut pas évoluer. La salle ne peut pas changer d’immeuble !
Page 3
Concept d'entité faible Représentation d'une entité faible :
Soit on représente par des traits en pointillé.
Soit on représente par des doubles traits.
Soit on la représente comme une entité normale en précisant en commentaires que l’entité est faible.
Page 4
Identifiant relatif
Pour identifier l'objet, on utilise l'identifiant de l'entité forte associé à un identifiant permettant de d'identifier de façon unique chaque occurrence de l'entité faible.
Exemple:
Numéro d’étage : 3 Salle : 325 Numéro d’étage : 1 Salle : 111Représentation: 2 solutions
Exercices d'application…
Exercice 1: Cas « Bibliothèque »
Un livre est identifié par un code artificiel délivré par la bibliothèque lors de la première entrée pour ce livre. Pour chacun, on note le nombre de pages et la date de dernière édition.
Pour un même livre, par exemple « Le malade imaginaire » de Molière, la bibliothèque achète plusieurs exemplaires, pas forcément tous à la même date ; ils sont alors en rayon.
Un abonné (numéro d’abonné, nom et prénom) n’emprunte pas un livre mais un exemplaire du livre, qui est repéré par un numéro (1, 2, 3 etc.) au sein du code du livre. On mémorisera les dates d’emprunt, de retour sachant qu’un abonné peut emprunter plusieurs fois le même livre.
Chaque livre est écrit par un ou plusieurs auteurs dont on enregistre, outre son
identité, ses dates de naissance et, éventuellement, de décès, ainsi que sa
nationalité. Chaque ouvrage est rattaché à un genre (Roman, Théâtre, Aventure,
Policier, Encyclopédie, Essai, Sciences etc.…)
Passage au modèle relationnel
LIVRES (codeLivre , nbPages , dateEdition , titre) codeLivre clé primaire de la table LIVRES
EXEMPLAIRES (#codeLivre , codeExemplaire , dateAchat) codeLivre , codeExemplaire clé primaire composée de la table EXEMPLAIRES codeLivre clé étrangère de la table EXEMPLAIRES qui référence codeLivre de la table LIVRES.
Page 7
Exercices d'application…
Exercice 3: Cas « Chantier »
Une entreprise est spécialisée dans la livraison de matériaux de toutes sortes à différents chantiers. Il faut connaître l’unité de mesure de ce matériau et son poids par unité.
Chaque camion a un code qui débute par celui du type auquel il appartient (camionnette, semi-remorque, camion-citerne, porte-engins…). Ce type est caractérisé par le code du permis nécessaire, le poids à vide, le poids total en charge et le volume utile.
Lors de chaque transport, le camion livre différents matériaux dans une certaine quantité. On doit connaître la date de transport.
De plus, chaque transport est identifié par un numéro d’ordre chronologique par rapport au chantier qu’il approvisionne
Page 8
LDD (Langage de Définition de Données)
Définition:
Nous avons travaillé auparavant avec le LMD (Langage de manipulation de données) en utilisant notamment les ordres:
• SELECT
• INSERT
• UPDATE
• DELETE
Le LMD manipule les données, c’est à dire le contenu des tables alors que le LDD manipule les éléments constituant la base de données elle-même.
Les objets que l’on pourra manipuler sont:
• des bases de données
• Des schémas
• Des tables
• Des indexs
• Des clusters
• Des sequences
• …/…
9
LDD (Langage de Définition de Données)
La gestion des tables:
Pour manipuler une table, nous disposons de 3 ordres:
• CREATE (Création)
• ALTER (Modification)
• DROP (Suppression)
10
LDD (Langage de Définition de Données)
Exemples des création de table : Il faut définir chaque attribut en indiquant:
• Son nom
• Son type
• Eventuellement les contraintes Chaque champ est séparé par une virgule
CREATE TABLE musicien(numMusi integer primary key, nomMusi varchar(50) not null, instrument varchar(20));
CREATE TABLE fournisseurs(
nomFourni varchar(25), prenomFourni varchar(25), adresseFourni varchar(50), telFourni char(14),
constraint pk_Fournisseurs primary key (nomFourni , prenomFourni));
Ici la contrainte ne porte pas sur un champ mais sur plusieurs: C’est une contrainte de niveau table.
11
LDD (Langage de Définition de Données)
Exemples des création de table :
CREATE TABLE oeuvre(numOeuvre integer primary key, nomOeuvre varchar(35), compOeuvre varchar(25),
numConc integer references concert(numConcert) on update cascade
on delete set null);
OU
CREATE TABLE oeuvre(
numOeuvre integer, nomOeuvre varchar(35), compOeuvre varchar(25), numConc integer,
constraint pk_Oeuvre primary key (numOeuvre),
constraint fk_oeuvre_concert foreign key (numConc) references concert(numConcert));
12
LDD (Langage de Définition de Données)
Exemples de modification de table :
ALTER TABLE musicienADD cachetMusi integer default 0;
ALTER TABLE musicien MODIFY cachetMusi numeric(5,2);
ALTER TABLE musicien DROP cachetMusi;
ALTER TABLE prix_option
ADD CONSTRAINT fk_prixoption_option FOREIGN KEY (id_option) REFERENCES options(id_option),
ADD CONSTRAINT fk_prixoption_modele FOREIGN KEY (id_modele) REFERENCES modele(id_modele);
13
LDD (Langage de Définition de Données)
Exemple d’utilisation de la contrainte check :
CREATE TABLE employe( numEmploye integer PRIMARY KEY , nomEmploye varchar( 20 ) NOT NULL , prenomEmploye varchar( 15 ) ,
qualifEmploye varchar( 12 ) default 'Technicien'
CHECK (qualifEmploye IN ('Ouvrier','Technicien','Ingenieur','DG')), servEmploye integer
);
Exemple de suppression de table
DROP TABLE employe;14
LCD (Langage de Contrôle des données) La gestion de privilèges
Objectifs:
Les bases de données ont pour objectif de pouvoir être accédées par de multiples utilisateurs simultanément.
Selon son profil, l’utilisateur peut n’être autorisé qu’à certaines opérations.
Il est possible grâce au LCD de mettre en place des privilèges d’accès aux bases de données.
Il est également possible de recourir à la gestion des vues pour garantir la confidentialité de certaines données.
15
LCD (Langage de Contrôle des données) La gestion de privilèges
Syntaxe d’attribution de privilèges: GRANT
1) Je veux autoriser l’utilisateur ‘Dupont’ à lire et à supprimer des lignes sur la table ‘Employe’.
GRANT SELECT , DELETE ON Employe TO Dupont;
2) Je veux permettre aux utilisateurs ‘Durand’ et ‘Dupuis’ d’insérer des valeurs dans les colonnes numEmploye, nom, prenom de la table ‘Employe’.
GRANT INSERT (numEmploye , nom , prenom) ON Employe
TO Dupont , Dupuis;
3) Je veux permettre à tout le monde de lire la table ‘Voiture’.
GRANT SELECT ON Voiture TO public;
16
LCD (Langage de Contrôle des données) La gestion de privilèges
Syntaxe d’attribution de privilèges: GRANT
Exercice: Autorisez l’utilisateur ‘Bokassa’ à supprimer des lignes sur la table ‘Diamant’.
GRANT DELETE ON Diamant TO Bokassa;
Question: Bokassa a-t-il le droit d’autoriser l’utilisateur ‘Valery’ à supprimer des lignes sur la table
‘Diamant’ ? Réponse: NON
Si je veux permettre à Bokassa de transmettre les droits que je lui donne, il faut ajouter l’option WITH GRANT OPTION.
GRANT DELETE ON Diamant TO Bokassa WITH GRANT OPTION;
LCD (Langage de Contrôle des données) La gestion de privilèges
Syntaxe de révocation de privilèges: REVOKE
1) Je veux supprimer les droits de lecture sur la table Employe pour ‘Dupont’.REVOKE SELECT ON Employe FROM Dupont;
2) Je veux interdire à Bokassa de transmettre ses droits de supprimer des lignes sur la table Diamant.
REVOKE GRANT OPTION FOR DELETE ON Diamant
FROM Bokassa;
3) Je veux interdire à Bokassa d’insérer des lignes sur la table Diamant ainsi qu’à tous ceux à qui il a attribué des droits.
REVOKE INSERT ON Diamant FROM Bokassa CASCADE;
Bases de données
Les vues :
19 Ph. CHOCHOIS
Les vues
Définition:
Une vue est une table logique basée sur une table.
Une vue peut aussi être basée:
- Sur une vue - Sur un ensemble de tables - Sur un ensemble de vues - Sur un ensemble de vues et de tables
La vue affiche des données qui ne lui sont pas propres mais les données qui proviennent des autres tables (ou vues).
C’est comme une fenêtre qui permet de visualiser une partie (sélection de lignes ou de colonnes) des tables.
Les vues sont stockées dans le SGBD. Vous pouvez donc les réutiliser dans d’autres sessions.
20
Les vues
Exemple :
Voici une table CLIENT affichée grâce à la requête suivante:
« SELECT * FROM CLIENT; »
21 NCLI NOM ADRESSE LOCALITE CAT COMPTE
B112 HANSENNE 23 A. DUMONT POITIERS C11250.00 C123 MERCIER 25 RUE LEMAITRE NAMUR C1 -2300.00
B332 MONTI 112 RUE NEUVE GENEVE B2 0.00 F010 TOTO 5 RUE GODEFROID POITIERS C1 0.00
Je crée une vue nommée « CLIENT_P »qui me permet de sélectionner les nom et adresse des habitants de Poitiers.
J’obtiens l’affichage suivant grâce à la requête suivante:
« SELECT * FROM CLIENT_P; »
NOM ADRESSE
HANSENNE 23 A. DUMONT TOTO 5 RUE GODEFROID
Les vues
Syntaxe :
La syntaxe pour créer une vue est très simple:
« CREATE VIEW nomVue AS requête; » nomVue: Nom attribué à la vue.
Requête: requête permettant de récupérer les données de la vue.
Exemple:
CREATE VIEW CLIENT_P AS SELECT nom , adresse FROM CLIENT
WHERE LOCALITE = ‘Poitiers’;
22
« SELECT * FROM CLIENT_P; »
NOM ADRESSE HANSENNE 23 A. DUMONT TOTO 5 RUE GODEFROIDLes vues
Utilité des vues :
-
Permet de simplifier l’écriture des requêtes
-
Permet de mémoriser les requêtes réutilisables
-
Permet de masquer certaines informations.
On peut par exemple donner les droits d’utiliser une vue mais interdire d’utiliser la table. Dans notre exemple, les utilisateurs ne pourront pas accéder aux soldes des comptes des clients.
23
Les vues
Les vues peuvent être utilisées comme des tables dans des requêtes.
On les appelle aussi des tables logiques.
Exemple:
SELECT nomclient FROM CLIENT_P WHERE compte > 8000;
SELECT * FROM CLIENT WHERE numclient NOT IN
(SELECT numclient FROM CLIENT_P);
24
Les vues
Insertion à l’aide d’une vue :
L’insertion à l’aide d’une vue est seulement possible avec certains SGBD et pour les vues simples (pour lesquelles il n’y a pas d’ambigüité).
-
Exemple d’insertion qui peut fonctionner:
CREATE VIEW employe10 AS SELECT * FROM EMPLOYE WHERE numservemploye = 10;
INSERT INTO employe10
VALUES (25383, 'Dupont', 'Chef','1998-09-01', 12000,NULL,10,NULL);
-
Exemple de vue avec insertion impossible:
CREATE VIEW nbemployeparservice AS
SELECT numservemploye , count(*) FROM EMPLOYE GROUP BY numservemploye;
25
Les opérateurs ensemblistes
Les opérateurs ensemblistes travaillent sur des ensembles ! On peut considérer le résultat d’une requête comme un ensemble de données Attention: Les ensembles sur lesquels on travaille doivent être cohérents entre eux.
Exemple: UNION (ou UNION ALL pour conserver les doublons) SELECT nomEmploye from EMPLOYE WHERE nomEmploye LIKE ‘%A%’
UNION
SELECT nomEmploye from EMPLOYE WHERE nomEmploye LIKE ‘%B%’ ;
1) Affichez les noms d’employés et leur supérieur mais affichez aussi ceux qui n’encadrent personne ainsi que ceux qui n’ont pas de supérieur
Select e.nomEmploye , s.nomEmploye AS chef from EMPLOYE e LEFT OUTER JOIN EMPLOYE s
ON e.matSuperieur = s.mat UNION
Select e.nomEmploye , s.nomEmploye AS chef from EMPLOYE e RIGHT OUTER JOIN EMPLOYE s
ON e.matSuperieur = s.mat;
Remarque: Le FULL OUTER JOIN n’étant pas implémenté dans MySQL, l’utilisation de UNION permet de remédier à ce manque.
26
Les opérateurs ensemblistes
Autres opérateurs ensemblistes pouvant être utilisés:
-UNION: Réunion de 2 ensembles
-INTERSECT: Intersection de 2 ensembles (on retient les éléments communs) -MINUS ou EXCEPT (Dépend du SGBD): Différence (On retient les éléments du premier ensemble qui ne sont pas dans le second).
27
La division SQL
La division SQL a pour but de répondre à une question du type:
« Lister les modèles qui disposent de toutes les options » 2 solutions possibles:
a) Compter le nombre d’options par modèle et comparer au nombre d’options total
b) Lister les modèles pour lesquels il n’existe pas une seule option qui ne soit pas proposée pour ce modèle
28
La division SQL
La division SQL a pour but de répondre à une question du type:
« Lister les modèles qui disposent de toutes les options » 2 solutions possibles:
a) Compter le nombre d’options par modèle et comparer au nombre d’options total b) Lister les modèles pour lesquels il n’existe pas une seule option qui ne soit pas proposée
pour ce modèle Solution a:
select m.id_modele , libelle_modele from modele m , prix_option p where m.id_modele = p.id_modele group by m.id_modele
having count(*) = (select count(*) from options);
Solution b:
select m.id_modele , libelle_modele from modele m
where not exists (select * from options o
where not exists
(select * from prix_option p where p.id_modele = m.id_modele and o.id_option = p.id_option));
Les triggers
Définition:
Un trigger (ou déclencheur) est une procédure compilée, cataloguée dans le dictionnaire qui s’exécute automatiquement chaque fois que l’élément déclencheur associé se produit.
Un trigger est attaché à une table de la base de données et reconnaît des événements liés à:
• L’insertion d’enregistrements
• La mise à jour des données
• La suppression de tuples On utilise les déclencheurs pour :
• Assurer le respect de contraintes référentielles
• Assurer des contraintes d’inclusion (s’assurer que des valeurs insérées sont présentes dans d’autres tables)
• Abandonner des transactions
• Automatiser certaines actions (opérations en chaînes)
Les contraintes standards gérées par les SGBD sont prioritaires par rapport aux triggers !
Remarque: La syntaxe des triggers dépend du SGBD
Les triggers
Syntaxe:
Déclencheur sur instruction LMD (Langage de manipulation de données) : CREATE [OR REPLACE]TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON table_name trigger_body
Trigger_name: Nom du déclencheur Timing: BEFORE ou AFTER
Event: INSERT ou DELETE ou UPDATE ou UPDATE OF column Table_name: Table ou vue associée au déclencheur
Trigger_body : Action effectuée par le déclencheur. Commence par DECLARE ou BEGIN et se termine par END ou appelle une procédure.
31
Les triggers
Syntaxe:
Déclencheur sur instruction LMD (Langage de manipulation de données) : CREATE [OR REPLACE]TRIGGER trigger_name
timing
event1 [OR event2 OR event3]
ON table_name trigger_body
Exemple avec le SGBD « Oracle »:
CREATE TRIGGER secure_dept BEFORE DELETE ON dept BEGIN
Raise_application_error(-20001, ‘La suppression d un département est interdite’);
END ;
Avec le SGBD « MySql »:
Les triggers sur instruction LMD n’ont pas été implémentés
32
Les triggers
Syntaxe:
Déclencheur sur une ligne LMD :
CREATE [OR REPLACE]TRIGGER trigger_name timing
event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old / NEW AS new]
FOR EACH ROW [WHEN (condition)]
trigger_body
Trigger_name: Nom du déclencheur Timing: BEFORE ou AFTER
Event: INSERT ou DELETE ou UPDATE ou UPDATE OF column Table_name: Table ou vue associée au déclencheur
Referencing : Indique les noms des anciennes et nouvelles valeurs de la table For each row : Indique que le déclencheur est un déclencheur sur ligne.
When : Indique la condition de restriction d’exécution du déclencheur Trigger_body : Action effectuée par le déclencheur. Commence par DECLARE ou BEGIN et se termine par END ou appelle une procédure.
Déclencheur sur instruction LMD (Langage de manipulation de données) :
33
Les triggers
Exemple avec le SGBD « Oracle »:
Déclencheur sur une ligne LMD :
CREATE OR REPLACE TRIGGER maj_commission BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW
WHEN (NEW.job = ‘SALESMAN’) BEGIN
IF INSERTING THEN :NEW.comm := 0;
ELSIF :OLD.comm IS NULL THEN :NEW.comm := 0;
ELSE :NEW.comm := :OLD.comm * 1.05;
END IF;
END ;
34
Les triggers
Exemple avec le SGBD « MySql »:
Déclencheur sur une ligne LMD : DELIMITER //
CREATE TRIGGER maj_commission_Insert BEFORE INSERT ON emp
FOR EACH ROW BEGIN
SET NEW.comm= 0;
END ; //
CREATE TRIGGER maj_commission_Update BEFORE UPDATE ON emp
FOR EACH ROW BEGIN
IF NEW.sal != OLD.sal THEN SET NEW.comm = OLD.comm*1.05;
END IF;
END;
//
DELIMITER ;
35
Les triggers
Remarques:
Les triggers peuvent s’imbriquer: Un trigger qui déclenche un ordre SQL peut faire appel à d’autres triggers.
Nous avons vu quelques exemples simples mais les triggers peuvent exécuter des actions complexes, notamment en utilisant les structures répétitives.
36
Les triggers
Exercice:
Contrainte: Une moto ne peut pas être équipée d’options qui ne sont pas proposées pour son modèle de moto.
37
Comment exprimer la contrainte ci-dessus ?
Les triggers
Solution de l’exercice avec
« Oracle »:
Contrainte: Une moto ne peut pas être équipée d’options qui ne sont pas proposées pour son modèle de moto.
38 CREATE OR REPLACE TRIGGER valide_options
BEFORE INSERT OR UPDATE OF id_option ON options_possedees FOR EACH ROW
DECLARE v_nb NUMBER(5);
v_modele NUMBER(5);
BEGIN
SELECT modele INTO v_modele FROM moto WHERE immatriculation = :NEW.immatriculation;
SELECT count(*) INTO v_nb FROM prix_option WHERE id_option = :NEW.id_option AND id_modele = v_modele;
IF (v_nb = 0)
THEN Raise_application_error(-20008, 'Option non autorisee pour ce modele');
END IF ; END ;
Les triggers
Solution impossible à mettre en œuvre dans MySql
La syntaxe qui serait ou sera à implémenter dans MySql sera la suivante:
39 CREATE TRIGGER valide_options
BEFORE INSERT ON optionspossedees FOR EACH ROW
BEGIN
DECLARE v_nb INT;
DECLARE v_modele INT;
DECLARE invalide CONDITION FOR -1001;
DECLARE EXIT HANDLER FOR invalide SET @error = 'Option interdite';
SELECT modele INTO v_modele FROM moto WHERE immatriculation = NEW.moto;
SELECT count(*) INTO v_nb FROM prix_option WHERE id_option = NEW.id_option AND modele = v_modele;
IF (v_nb = 0) THEN SIGNAL invalide;
END IF;
END ;