Académique Documents
Professionnel Documents
Culture Documents
• Mais
– Ne propose que des structures : pas d’opérations
Redondances (duplications)
Erreurs possibles lors de l’insertion
Erreurs possibles lors de la mise-à-jour
Si l’on modifie l’année de naissance d’Hitchcock pour Vertigo ...
Si destruction d’un film, on risque de supprimer le metteur en scène
La bonne méthode
Représenter individuellement les films et les réalisateurs
• Une modification de l’un n’entraîne pas une modification de
l’autre
• Définir une méthode d’identification des films ou des
réalisateurs
• La même information est représentée une seule fois
• Préserver le lien entre films et réalisateurs, mais sans
introduire de redondance
La bonne méthode
Titre Année Nom MES Prénom MES Année de Naiss
Alien 1979 Scott Ridley 1943
Vertigo 1958
Titanic 1997 Hitchcock Alfred 1899
• ayant un sens
• pouvant être utilisée de manière autonome
– Ex : NomAssuré, AnnéeSouscription, NbContrats
• Servent à décrire les entités et les associations
– = Attributs ou colonnes
• prennent des valeurs appelées occurrences de la propriété
Propriété Occurrences
Un client a établi un ou plusieurs contrat(s) mais un contrat a été établi avec un seul client.
Un client peut commander plusieurs produits et un produit peut être commandé par plusieurs clients.
Attention ces questions, il faut les poser dans les deux sens de A vers B puis de B vers A.
Cardinalité minimum
nombre minimum d’occurences d’une entité X dans l’association considérée.
Cardinalité maximum
nombre maximum d’occurences d’une entité X dans l’association considérée.
Les valeurs de cardinalités sont en général 0, 1 ou N
La cardinalité minimum à 0 veut dire que certaines occurrences de
l’entité X ne sont pas impliquées dans une occurrence de l’association.
Attention ces questions, il faut les poser dans les deux sens
Acteurs vers Films : le rôle de type 1,N De Films vers Acteurs 0,N:
- (1) un acteur a joué dans au moins un film - (0) : un film n’ayant pas d’acteurs,
- (N) un acteur peut avoir joué dans plusieurs films possible si c’est un film documentaire
- (N) : un film peut avoir plusieurs acteurs
compléter le schéma ?
Une association
peut être réflexive
(relie une entité à
un artiste peut
elle-même) réaliser plusieurs films
ou aucun
Association conditionnelle
(type c) Association multiple conditionnelle
À chaque entité de E1 (type mc)
correspond au plus une À chaque entité de E1 correspond
entité de E2 aucune, une, ou plusieurs entité(s)
Généralisation :
• Processus d’abstraction consistant à généraliser
les entités, et les ensembles d’entités, en un seul
ensemble ascendant.
Spécialisation :
• Les sous-ensembles d’entités dans une hiérarchie
de généralisation résultent du processus de
spécialisation.
• Les sous-ensembles peuvent avoir une
intersection
– Ex : Etudiant : appartenant à club de foot et club
cinéma
La spécialisation est la division d'un ensemble
d'entités en sous-classes. A l'inverse la
généralisation est un regroupement d'un
ensemble d'entités en une super classe. (ISA = ...
is a ...)
Clé d’une association
• La clé d’une association (binaire) entre un type d’entité E1 et
un type d’entité E2 est le couple constitué de la clé c1 de E1 et
la clé c2 de E2.
Entité forte
• Entité qui, disposant de son propre identifiant, peut être
considérée isolément.Ex : étudiant Assuré (N° de carte
étudiants)
Entité faible
• Entité ne pouvant exister qu’en étroite association avec une
autre. Ex : emploi de temps relatif_à une classe
Avantages et inconvénients du modèle E/A
Avantages
•Il n’y a que trois concepts : entités, associations et attributs
•Représentation graphique intuitive (même si beaucoup de conventions)
•Permet de modéliser rapidement des structures pas trop complexes
Pauvreté
•Difficile d’exprimer des contraintes d’intégrité
•Difficile d’exprimer des structures complexes
•La conception en schémas reste en partie matière de bon sens et
d’expérience
•Ne propose pas d’opérations sur les données
Contraintes
Contraintes d’intégrité : toutes règles implicites ou explicites que doivent
suivre les données
Le nombre d’étudiants par classe est un entier positif > 0
Contraintes d'entité: toute entité doit posséder un identificateur
Toute salle de classe porte un identifiant
Contraintes de domaine : les valeurs de certains attributs doivent être prises
dans un ensemble donné
La fonction d’un enseignant à l’Université prend sa valeur dans l’ensemble
{vacataire, prof de chair, chef département …}.
Contraintes d'unicité : une valeur d'attribut ne peut pas être affectée deux
fois à deux entité différentes
Un département, identifié par son numéro, a un nom unique (il n’y a pas deux
départements de même nom)
Contraintes générales : règle permettant de conserver la cohérence de la
base de manière générale
Un même examen ne peut pas avoir lieu dans deux salles différentes à la
même date et à la même heure.
Méthodologie à suivre pour modéliser un problème
Déterminer les entités/classes et attributs :
• entité/instance de classe = objet décrit par de l’information
• objet caractérisé uniquement par un identifiant = attribut
• attribut multi-valué ou avec une association 1:N = entité ou
instance
• attacher les attributs aux ensemble d’entités/classes qu'ils
décrivent le plus directement
• éviter au maximum les identificateurs composites
Identifier les généralisations-spécialisations/héritage
Définir les associations
• éliminer les associations redondantes
• éviter les associations n-aires
• calculer les cardinalités de chaque association
le modèle entité/association s'appelle Modèle
Conceptuel des Données (MCD).
Et comme il est conceptuel, il n'a pas de
contraintes. Les contraintes apparaîtront dans l'une
des étapes suivantes : le Modèle Logique de
Données (MLD)... qui ne connaît ni association ni
entité.
dépendances fonctionnelles) .
et est dirigé par un employé unique (noSsDir). La date (dateDebDir) à laquelle l’employé a commencé
à diriger le service est comptabilisée. Un service peut avoir plusieurs emplacements chacun est
• Un service contrôle un certain nombre de projets, chacun d’entre eux ayant un nom(nomProjet), un
• Le nom de chaque employé, son numéro de Sécurité sociale(noSs), son adresse, son salaire, son sexe
et sa date de naissance sont mémorisés. Un employé est affecté à un service(noSce), mais peut
travailler sur plusieurs projets qui ne sont pas forcément contrôlés par le même service.
• Le nombre d’heures hebdomadaires travaillées par chaque employé par projet est comptabilisé. Le
• Les ayants droit de chaque employé(noSsEmpl)doivent être indiqués pour des raisons d’assurance.
Leur prénom, leur sexe, leur date de naissance et leur lien de parenté avec l’employé sont mémorisés.
Modèle relationnel
• Domaine : ensemble de valeurs caractérisé par un nom
Propriété =>Attribut
généralisation-spécialisation/héritage ⇒
Notre schéma peut être optimisé car il contient une association de type 1,1.
Attention : même si le langage SQL est normalisé, chaque SGBD a des particularités
syntaxiques => il faut se référer à la documentation du système utilisé !
La norme SQL ANSI propose un ensemble de types qui sont donnés dans le tableau 4.1.
Ce tableau
présente également la taille, en octets, des instances de chaque type, cette taille n’étant
ici qu’à titre indicatif car elle peut varier selon les systèmes.
Opérations sur tables
Définition de schémas de relations (et création des tables correspondantes) :
create table nom_relation (nom_attribut_1 type_attribut_1, …)
on admet que certains attributs peuvent ne pas avoir de valeur, ce qui est très différent
d’une chaîne vide ou de 0. Quand on parle de valeur NULL en SQL2, il s’agit en fait d’une
absence de valeur.
En conséquence :
1. on ne peut pas faire d’opération incluant un NULL ;
2. on ne peut pas faire de comparaison avec un NULL.
L’option NOT NULL oblige à toujours indiquer une valeur. L’option suivante permet ainsi de
garantir que tout internaute a un mot de passe.
motDePasse VARCHAR(60) NOT NULL
Le SGBD rejettera alors toute tentative d’insérer une ligne dans Internaute sans donner de
mot de passe. Si les valeurs à NULL sont autorisées, il faudra en tenir compte quand on
interroge la base.
Cela peut compliquer les choses, voire donner des résultats surprenants : il est préférable
de forcer les attributs important à avoir une valeur.
Une autre manière de forcer un attribut à toujours prendre une valeur est de spécifier une valeur par
défaut avec l’option DEFAULT.
Contraintes
La création d’une table il y a toujours des contraintes et il est indispensable de les inclure dans
le schéma pour assurer (dans la mesure du possible) l’intégrité de la base.
Voici les règles (ou contraintes d’intégrité) que l’on peut demander au système de garantir :
• Un attribut doit toujours avoir une valeur. C’est la contrainte NOT NULL vue précédemment.
• Un attribut (ou un ensemble d’attributs) constitue(nt) la clé de la relation.
• Un attribut dans une table est liée à la clé primaire d’une autre table (intégrité référentielle).
• La valeur d’un attribut doit être unique au sein de la relation.
• Enfin toute règle s’appliquant à la valeur d’un attribut (min et max par exemple).
Contraintes
Les contraintes sur les clés doivent être systématiquement spécifiées. La dernière (clause CHECK)
s’appuie en grande partie sur la connaissance du langage d’interrogation de SQL et sera vue
ultérieurement.
En revanche les clés secondaires peuvent être créées ou supprimées beaucoup plus facilement. La
clé primaire est spécifiée avec l’option PRIMARY KEY.
On peut également spécifier que la valeur d’un attribut est unique pour l’ensemble de la
colonne. Cela permet d’indiquer des clés secondaires.
deux artistes ne peuvent avoir les mêmes nom et prénom avec l’option UNIQUE.
Dans le cas d’une entité faible, on décide en général de détruire le composant quand on
détruit le composé. Par exemple, quand on détruit un cinéma, on veut également détruire
les salles ; quand on modifie la clé d’un cinéma, on veut répercuter la modification sur ses
salles.
CREATE TABLE Salle (nomCinema VARCHAR (30) NOT NULL,
no INTEGER NOT NULL,
capacite INTEGER,
PRIMAR KEY (nomCinema, no),
FOREIGN KEY (nomCinema) REFERENCES Cinema
ON DELETE CASCADE
ON UPDATE CASCADE);
Il est important de noter que nomCinema fait partie de la clé et ne peut donc pas être NULL.
On ne pourrait donc pas spécifier ici ON DELETE SET NULL.
La spécification des actions ON DELETE et ON UPDATE simplifie considérablement la gestion
de la base par la suite : on n’a plus par exemple à se soucier de détruire les salles quand on
détruit un cinéma.
CHECK pour exprimer des contraintes portant soit sur un attribut, soit sur une ligne
CREATE TABLE Film (titre VARCHAR (50) NOT NULL,
annee INTEGER CHECK (annee BETWEEN 1890 AND 2000) NOT NULL,
genre VARCHAR (10) CHECK (genre IN (’Histoire’,’Western’,’Drame’)),
idMES INTEGER,
codePays INTEGER,
PRIMARY KEY (titre),
FOREIGN KEY (idMES) REFERENCES Artiste,
FOREIGN KEY (codePays) REFERENCES Pays);
Au moment d’une insertion dans Film, ou d’une modification de l’attribut annee ou genre, le
SGBD vérifie que la valeur insérée appartient à l’ensemble énuméré défini par CHECK.
CREATE TABLE Pays (code VARCHAR (4) DEFAULT 0 NOT NULL,
nom VARCHAR (30) NOT NULL,
langue VARCHAR (30) NOT NULL,
PRIMARY KEY (code))
INSERT INTO Pays VALUES (0, ’Inconnu’, ’Inconnue’);
INSERT INTO Pays VALUES (1, ’France’, ’Français’);
INSERT INTO Pays VALUES (2, ’USA’, ’Anglais’);
INSERT INTO Pays VALUES (3, ’Allemagne’, ’Allemand’);
INSERT INTO Pays VALUES (4, ’Angleterre’, ’Anglais’);
Si on ne fait pas de vérification automatique, soit avec CHECK, soit avec la
commande FOREIGN KEY, il faut faire cette vérification dans
l’application, ce qui est plus lourd à gérer
Modification du schéma
ALTER TABLE nomTable ACTION description
ACTION peut être principalement ADD, MODIFY, DROP ou RENAME
ALTER TABLE Internaute ADD region VARCHAR(10);
ALTER TABLE Internaute MODIFY region VARCHAR(30) NOT NULL;
ALTER TABLE Internaute ALTER region SET DEFAULT ’Tunis’;
ALTER TABLE Internaute DROP region;
Création d’index
Un index offre un chemin d’accès aux lignes d’une table qui est considérablement plus rapide
que le balayage de cette table. Les SGBDL créent systématiquement un index sur la clé primaire
de chaque table. Il y a deux raisons à cela ;
1. l’index permet de vérifier rapidement, au moment d’une insertion, que la clé n’existe pas
déjà
2. beaucoup de requêtes SQL, notamment celles qui impliquent plusieurs tables (jointures), se
basent sur les clés des tables pour reconstruire les liens. L’index peut alors être utilisé pour
améliorer les temps de réponse.
Un index est également créé pour chaque clause UNIQUE utilisée dans la création de la table.
On peut de plus créer d’autres index, sur un ou plusieurs attributs, si l’application utilise des
critères de recherche autres que les clés primaire ou secondaires.
CREATE [UNIQUE] INDEX nomIndex ON nomTable (attribut1 [, ...])
CREATE UNIQUE INDEX idxNom ON Artiste (nom, prenom);
CREATE INDEX idxGenre ON Film (genre);
Cet index permettra d’exécuter très rapidement des requêtes SQL ayant comme critère de
recherche le genre d’un film.
SELECT * FROM Film WHERE genre = ’Western’
il ne faut pas créer des index à tort et à travers, car ils ont un impact négatif sur les commandes
d’insertion et de destruction. À chaque fois, il faut en effet mettre à jour tous les index portant
sur la table, ce qui représente un coût certain
Opérations sur n-uplets
à savoir :
- pour voir tous les attributs d’une relation : select * from nom_table
- élimination des doubles : select distinct nom_attribut …
- ordonnancement des résultats : order by nom_attribut (à la fin de la requête)
- opérateurs arithmétiques : = != > >= < <=
- opérateurs logiques : and, or, not
- test entre valeurs : nom_attribut between val_attr_1 and val_attr_2
- appartenance d’une valeur d’attribut à un ensemble : *not] in, any, all
- fonctions agrégat : avg, sum, min, max, count
- utilisation des fonctions agrégat avec groupage : group by, having
La jointure permet d’exprimer des requêtes portant sur des données réparties dans plusieurs
tables
la requête suivante : donner le nom des clients avec le nom des stations où ils ont séjourné. Le
nom du client est dans la table Client, l’information sur le lien client/station dans la table Sejour
REQUÊTES IMBRIQUÉES
SELECT station
FROM Sejour
WHERE idClient IN (SELECT id FROM Client WHERE ville = ’hamamet’)
SELECT nomStation
FROM Activite A1
WHERE EXISTS (SELECT ’x’FROM Activite A2
WHERE nomStation = ’hamamet’
AND A1.libelle = A2.libelle
AND A1.prix = A2.prix)
manipuler simultanément plusieurs tables
SELECT COUNT(nomStation), AVG(tarif), MIN(tarif), MAX(tarif) FROM Station
SELECT nomStation, AVG(tarif) FROM Station
Combien de places réservées par ALI
SELECT SUM (nbPlaces) afficher les régions avec le nombre de stations.
FROM Client, Sejour SELECT region, COUNT(nomStation)
WHERE nom = ’ALI’ FROM Station
AND id = idClient GROUP BY region
6 types de droits. Les quatre premiers portent sur le contenu d’une table
Insertion (INSERT), Modification (UPDATE), Recherche (SELECT), Destruction (DELETE),
Il existe deux autres droits :
REFERENCES donne le droit à un utilisateur non propriétaire du schéma de faire référence à
une table dans une contrainte d’intégrité.
USAGE permet à un utilisateur non propriétaire du schéma d’utiliser une définition (autre
qu’une table ou une assertion) du schéma.
Nécessité de mécanismes de protection et de sécurité dans les SGBD
à différents niveaux :
a) contrôle des utilisateurs souhaitant accéder à une BD
b) contrôle de l’accès aux données (lecture, écriture)
c) contrôle de l’intégrité des données, et de la validité des MAJ
Deux classes de droits d’accès aux données :
a) consultation
b) MAJ -> insertion, suppression, modification
Exemples
Table PERSONNEL (Id, Nom, Adresse, Service, Salaire)
a) Foulen possède tous les droits d’accès (consultation, MAJ) sur PERSONNEL
b) Foulen ne possède aucun droit
c) Foulen ne peut que lire que l’information le concernant, et il ne peut pas la modifier
d) Foulen ne peut que lire que l’information le concernant, et il peut modifier son adresse
e) foulen ne peut que lire que l’information le concernant, et il peut modifier son salaire s’il
est responsable du service (information présente dans une autre table)
Pb : le schéma de la BD peut évoluer au fil du temps (MAJ des schémas de relation)
le mécanisme de contrôle des droits d’accès doit en tenir compte
Deux commandes pour l’administrateur de la base de données : grant (octroi) et
revoke (annulation)
Syntaxe :
- usage -> accès au domaine de définition d’un attribut (ou d’un ensemble d’attributs)
- select -> accès en lecture (consultation)
- insert (col) -> insertion de valeurs dans la colonne spécifiée
- insert -> insertion de valeurs dans toutes les colonnes d’une table
- update (col) -> modification de valeurs dans la colonne spécifiée
- update -> modification de valeurs dans toutes les colonnes d’une table
- delete -> suppresion de n-uplets
- references (col) et references -> possibilité de faire référence à certaines colonnes
ou à toutes les colonnes d’une table dans des contraintes d’intégrité
- all -> tous les droits
Forme générale de la commande grant :
GRANT <privilege>
ON <element du schema>
TO <utilisateur>
[WITH GRANT OPTION]
Une vue n’induit aucun stockage puisqu’elle n’existe pas physiquement, et permet
d’obtenir une représentation différente des tables sur lesquelles elle est basée.
Exemple : on peut créer une vue qui ne contient que les cafés de bardo
On peut utiliser les vues et les tables dans des requêtes SQL.
Par exemple la requête Quels acteurs ont tourné un film en 2010
SELECT acteur, prenom
FROM Casting
WHERE annee = 2010
On peut ensuite donner des droits en lecture sur cette vue pour
que cette information limitée soit disponibleà tous.
GRANT SELECT ON Casting TO PUBLIC
Mise à jour d’une vue
Il existe de sévères restrictions sur les droits d’insérer ou de mettre-à-jour des tables
à travers les vues.
insérer une ligne dans la vue Casting. Cet ordre s’adresse à une vue issue de trois tables.
INSERT INTO CASTING (film, annee, acteur, prenom) VALUES (’Titanic’, 1998, ’DiCaprio’,
’Leonardo’);
Il n’y a clairement pas assez d’information pour alimenter ces tables de manière cohérente, et
l’insertion n’est pas possible (de même que toute mise à jour). De telles vues sont dites non
modifiables.
Les règles définissant les vues modifiables sont très strictes.
1. La vue doit être basée sur une seule table.
2. Toute colonne non référencée dans la vue doit pouvoir être mise à NULL ou
disposer d’une valeur par défaut.
3. On ne peut pas mettre-à-jour un attribut qui résulte d’un calcul ou d’une
opération.
L’usage l’option WITH CHECK OPTION permet de garantir que toute ligne insérée
dans la vue satisfait les critères de sélection de la vue.
CREATE VIEW cafébardo
AS SELECT * FROM café
WHERE ville = ’bardo’
WITH CHECK OPTION
triggers
Le mécanisme de triggers (que l’on peut traduire par ’déclencheur’ ou ’réflexe’) implanté
dans de nombreux SGBD
Absent de la SQL2 mais constitue un des points de discussion de la norme SQL3
Un trigger est une procédure qui est déclenchée par des évènements
de mise-à-jour spécifiés par l’utilisateur et ne s’exécute que quand
une condition est satisfaite
les triggers sont une extension potentielle aux contraintes proposées par CHECK : sauf que
• l’évènement déclencheur est explicitement indiqué,
• l’action n’est pas limitée à la simple alternative acceptation/rejet
Actions offertes
• La possibilité d’éviter les risques d’incohérence dus à la présence de redondance.
• L’enregistrement automatique de certains évènements (auditing).
• La spécification de contraintes liées à l’évolution des données (exemple : le prix
d’une séance ne peut qu’augmenter).
• Toute règle complexe liée à l’environnement d’exécution (restrictions sur les
horaires, les utilisateurs, etc).
triggers
Le mécanisme de triggers (que l’on peut traduire par ’déclencheur’ ou ’réflexe’) implanté
dans de nombreux SGBD
Absent de la SQL2 mais constitue un des points de discussion de la norme SQL3
Un trigger est une procédure qui est déclenchée par des évènements
de mise-à-jour spécifiés par l’utilisateur et ne s’exécute que quand
une condition est satisfaite
les triggers sont une extension potentielle aux contraintes proposées par CHECK : sauf que
• l’évènement déclencheur est explicitement indiqué,
• l’action n’est pas limitée à la simple alternative acceptation/rejet
Actions offertes
• La possibilité d’éviter les risques d’incohérence dus à la présence de redondance.
• L’enregistrement automatique de certains évènements (auditing).
• La spécification de contraintes liées à l’évolution des données (exemple : le prix
d’une séance ne peut qu’augmenter).
• Toute règle complexe liée à l’environnement d’exécution (restrictions sur les
horaires, les utilisateurs, etc).
Principes des triggers
Le modèle d’exécution des triggers est basé sur la séquence Evénement-
Condition-Action (ECA)
1. un trigger est déclenché par un évènement, spécifié par le programmeur, qui est en
général une insertion, destruction ou modification sur une table ;
2. la première action d’un trigger est de tester une condition : si cette condition ne
s’évalue pas à TRUE, l’exécution s’arrète ;
3. l’action proprement dite peut consister en toute opération sur la base de données :
les SGBD fournissent un langage permettant de créer des procédures.
• Un trigger permet de manipuler simultanément les valeurs ancienne et nouvelle
de la donnée modifiée, ce qui permet de faire des tests sur l’évolution de la base.
• un trigger peut être exécuté au choix une fois pour un seul ordre SQL, ou à chaque
ligne concernée par cet ordre.
• l’action déclenchée peut intervenir avant l’évènement, ou après.
L’utilisation des triggers permet de rendre une base de données
dynamique : une opération sur la base peut en déclencher d’autres, qui
elles-mêmes peuvent entraîner en cascade d’autres réflexes. Ce
mécanisme n’est pas sans danger à cause des risques de boucle infinie.
L’utilisation des triggers permet de rendre une base de
données dynamique : une opération sur la base peut en
déclencher d’autres, qui elles-mêmes peuvent entraîner en
cascade d’autres réflexes. Ce mécanisme n’est pas sans
danger à cause des risques de boucle infinie.
Syntaxe
CREATE trigger <nom-trigger>
<quand> <événements> ON <table>
[FOR EACH ROW [WHEN <condition>]]
BEGIN
<action>
END;
exemple de trigger qui maintient la capacité d’un cinéma à chaque MAJ sur la table
Salle
CREATE TRIGGER CumulCapacite
AFTER UPDATE ON Salle
FOR EACH ROW
WHEN (new.capacite != old.capacite)
BEGIN
UPDATE Cinema
SET capacite = capacite - :old.capacite + :new.capacite
WHERE nom = :new.nomCinema;
END;
Pour garantir la validité du cumul, il faut créer des triggers sur UPDATE et INSERT.
Une solution plus concise (mais plus coûteuse) est de recalculer systématiquement
le cumul, c.a.d un trigger qui se déclenche globalement
CREATE TRIGGER CumulCapaciteGlobal
AFTER UPDATE OR INSERT OR DELETE ON Salle
BEGIN
UPDATE Cinema C
SET capacite = (SELECT SUM (capacite)
FROM Salle S
WHERE C.nom = S.nomCinema);
END;
Les choix possibles sont :
• quand peut être BEFORE ou AFTER.
• événements spécifie DELETE, UPDATE ou INSERT séparés par des OR.
• FOR EACH ROW est optionnel. En son absence le trigger est déclenché une fois
pour toute requête modifiant la table, et ce sans condition. Sinon condition est
toute condition booléenne SQL.
• on peut référencer les anciennes et nouvelles valeurs du tuple courant avec la
syntaxe new.attribut et old.attribut respectivement.
• action est une procédure qui peut être implantée (sous Oracle, avec le langage
PL/SQL). Elle peut contenir des ordres SQL
• Les anciennes et nouvelles valeurs du tuple courant sont référencées par :new.attr
et :old.attr.
• Il est possible de modifier new et old.
Par exemple
:new.prix=500; forcera l’attribut prix à 500 dans un BEFORE trigger.
Remarque : la disponibilité de new et old dépend du contexte. Par exemple new est
à NULL dans un trigger déclenché par DELETE.
Exemples (syntaxe d’oracle):
lorsqu’un nouvel employé est inséré dans la base, le nombre d’employés figurant dans la
relation rayon de magasin doit augmenter de un pour le rayon du nouvel employé.
Dans SQL, on définit alors une action spontanée ou TRIGGER de la manière suivante :
Appel de la fonction
employee_name := employer_details_func;
Ou
SELECT employer_details_func FROM dual;
PL/SQL procédure
CREATE [OR REPLACE] PROCEDURE
proc_name
[list of parameters] CREATE OR REPLACE employer_details_proc
IS IS
Declaration section emp_name VARCHAR(20);
BEGIN BEGIN
Execution section SELECT first_name INTO emp_name FROM
EXCEPTION emp_tbl WHERE empID = '100';
Exception section dbms_output.put_line(emp_name);
END; END;
Appel de la procédure
EXECUTE [or EXEC] procedure_name;
Ou
procedure_name;
PL/pgSQL (PostgreSQL) Pas de procédures au
niveau de postgress
CREATE FUNCTION genererIdUser() RETURNS OPAQUE AS
DECLARE
iduser integer;
BEGIN
SELECT INTO iduser MAX(id_user) FROM user;
IF iduser ISNULL THEN iduser := 0;
END IF;
NEW.id_user := iduser + 1;
RETURN NEW;
END;
LANGUAGE 'plpgsql';
mysql
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END
CALL simpleproc(@a)
Bonjour, le monde!
Le pourquoi des procédures
• L’appel d’une procédure stockée, nécessite simplement de
spécifier son nom et ses valeurs de paramètres. C'est donc moins
coûteux en termes de quantité de données qu'une commande
complète Dès lors cela réduit le trafic réseau entre les applications
et le serveur.
• Lorsqu'on crée une procédure stockée, celle-ci est compilée en un
plan qui demeure dans le cache de procédures, ce qui réduit
considérablement le coût de calcul du plan d'une requête,
gourmand en ressources processeur.
• L'utilisation de procédure stockées permet la réutilisation de
code. S'il est clair que cela n'augmente pas les performances, cela
augmente la productivité des développeurs qui ont moins de code
à produire, et qui passent donc moins de temps à le débugger.
Il faut garder à l'esprit que ce n'est pas parce que l'on utilise
exclusivement des procédures stockées que l'application sera
performante.
L’exécution d'une requête ou d'un programme fait naître au niveau du
SGBD une occurrence de transaction
Une transaction est une unité de traitement séquentiel (séquence
d'actions cohérente), exécutée pour le compte d'un usager, qui
appliquée à une base de données cohérente restitue une base de
données cohérente.
- Atomicité: que lors d'une exécution d'une transaction toutes ses actions sont exécutées ou
- Permanence: De plus les effets d'une transaction qui s'est exécutée correctement doivent
- Isolation : que chaque transaction soit isolée, de manière à éviter des incohérences lors
d'exécutions concurrentes
Pour terminer une transaction on peut :
• Valider la transaction (COMMIT) : toutes les modifications
deviennent effectives
• Annuler la transaction (ROLLBACK) : toutes les modifications sont
annulées
Les ordres DDL (create table par exemple)provoquent un COMMIT
automatique
Le modèle général de transaction est
le suivant :
BEGIN TRANSACTION ;
---- Exemple
REQUETES insert into dept values (10,
'Finance', ‘Tunis');
INSTRUCTIONS delete from emp;
----- rollback;
COMMIT ; ou bien ROLLBACK ;
Transaction Oracle Transaction Postgres
En Oracle, toute exécution fait En PostgreSQL une transaction
partie d’une transaction. commence avec l’instruction start
Une transaction commence avec la transaction ... (ou begin) et se
première instruction DML ou set termine comme en Oracle.
transaction qui suit :
•la connexion (début de session)
•une instruction DDL réussie
• une validation (ordre commit)
•une annulation (ordre rollback)
Une transaction se termine juste Si on n’utilise pas l’instruction start
après transaction ... (ou begin) alors, par
• une validation (ordre commit) défaut, chaque instruction DML est
• une annulation (ordre rollback) exécutée comme une transaction
• déconnexion normale ⇒ complète, on parle alors de
validation fonctionnement en auto commit (
• déconnexion anormale ⇒
annulation
Transactions longues
Exemple : organisation par une agence de voyage d’un voyage Tunis – Hongkong
Cela nécessite la réservation de plusieurs billets d’avion :
Tunis-> Paris ; Paris –> Pekin ; Pekin – >honking
On commence par réserver les 2 premiers mais si on ne peut trouver de Pekin – >
honkong, il faut tout annuler
Problèmes avec les transactions longues
• Manque de souplesse : si on ne trouve pas de voyage Pekin – > honkong, on
annule tout. alors qu’on aurait pu garder le Tunis-> Paris et essayer de passer par
Shanghai pour aller à honkong , en annulant seulement le Paris – pekin
• Autre problème : le contrôle de la concurrence effectue des blocages sur les
tables et les lignes qui ne sont relâchés qu’à la fin de la transaction ( on bloque
des places sur des vols pour paris et pour pekin)
Un problème de communication peut provoquer l’annulation des dernières alors
qu’on pourrait simplement réessayer le lendemain
Transactions emboîtées
Extension de la notion de transaction « plate » et «préférablement courte » ,
avantages :
• Évite les annulations complètes de transactions
• Apporte plus de souplesse dans les transactions longues et multi-sites
• Permet de limiter la durée des blocages des ressources système
Définition des transactions emboîtées
Une transaction globale (mère) peut contenir des sous transactions filles qui, elles-mêmes,
peuvent avoir des filles
L’annulation d’une transaction n’annule pas nécessairement la transaction mère ; celle-ci peut :
• décider d’un traitement substitutif
• reprendre la transaction annulée
• s’annuler
• ou même ignorer l’annulation (traitement pas indispensable)
• L’annulation d’une transaction provoque l’annulation automatique de toutes ses
transactions filles
savepoint foulen_note ;
savepoint foulena_note ;
commit ;
Propriétés des transactions - ACID
• Atomicité : un tout indivisible
• Cohérence : une transaction doit laisser la base dans un
état cohérent ; elle ne doit pas mettre les données dans
un état « anormal »
• Isolation : une transaction est isolée des autres
transactions (dans une certaine mesure…)
• Durabilité : le SGBD doit garantir que les modifications
d'une transaction validée seront conservées, même en
cas de panne
Transactions et Contrôle de Concurrence
Exemple
“dirty reads
Uncommited Data
Transaction: Atomicité, Cohérence, Isolation, Durabilité
Exécution
Recouvrabilité : Possibilité d’annuler l’effet d’une transaction qui
abandonnée (abort).
Solution : Ordre des Commit effectués par les transactions suit
l’ordre de dépendances Lecture(X)/Ecriture(X).
Rmq : Les verrous sont posés au niveau de la table avec cette commande.
Le niveau le plus élevé est ACCESS EXCLUSIVE qui assure que l'accès est
réservé uniquement à la transaction en cours.
C'est le niveau demandé pour la modification de la structure d'une table par
exemple.
RAID 7
C'est le summum des niveaux de RAID : il permet la gestion de 48
disques. Le nombre de disques destinés au stockage des données et de
la parité est paramétrable. Les performances en écriture sont de 2 à 6
fois supérieures et celles en lecture sont elles aussi très élevées grâce à
la présence d'un cache.
Cette solution est toutefois peu utilisée car elle est très coûteuse à
mettre en œuvre.
équilibre entre la performance et la sécurité
Performance
• Taille et usage du buffers
• Fréquences d’échanges entre le buffer et le disque
Défaillance
• Un défaillance en mémoire centrale implique une perte des
données modifiées mais non encore écrites sur disque.
• Si un disque est endommagé toutes les données sont
perdues et il faut recourir à une sauvegarde.
• une perte d’information (tout ce qui a été fait depuis la
dernière sauvegarde est prévu)
• une perte de temps due à l’indisponibilité du système
pendant la récupération sauvegarde.
Le RAID 01 :
Il cumule l'avantage du Raid 0 et 1 : il y a dans
notre exemple 4 disques. On met les disques
en Raid 0 deux par deux. Les disques logiques
crées (deux dans notre cas) sont mis en Raid
1. Résultat : des performances en lecture et
écriture largement améliorées et la possibilité
de perdre deux disques (dans notre cas on
peut perdre les deux disques d'un ensemble
Raid 0)
Le RAID 10 :
C'est l'inverse du Raid 01, dans le sens ou les
disques sont d'abord placés en Raid 1 pour ne
former qu'une unité en Raid 0. On obtient
ensuite une capacité égale aux deux disques
Raid 1 si ceux ci sont de même capacité. Cette
configuration permet la perte de deux
disques.
Le Raid X0 :
Ce mode désigne en fait des niveaux comme le Raid "50" ou encore "10
Dans le cas du mode 50, on prend un ensemble Raid 5 monté ensuite en
Raid 0
Reprise du système:
Défaillance locale (transaction particulière) : discutée
précédemment. N ’affecte que la transaction dans laquelle la
défaillance s ’est produite.
Défaillance globale : affecte toutes les transactions en cours d
’exécution au moment de la défaillance => nombreuses
conséquences au niveau du système.
Il en existe 2 types :
– défaillances système, dites douces : pannes de courant, …
– défaillances des supports, dites dures : disques
endommagés, fichiers perdus, ...
On traite les défaillances douces, les défaillances dures nécessitent d ’avoir des
copies de sauvegarde, un journal, des utilitaires de sauvegarde,....
Dans les défaillances système, le point crucial est le contenu, volatile, de la
MC. Les contenus des tampons de la DB en MC sont perdus. L ’état précis des
transactions en cours d’exécution au moment de la défaillance est inconnu. De
telles transactions ne peuvent jamais se terminer par un succès et doivent
être annulées (rollback).
De plus, il pourrait être nécessaire de « rejouer » certaines transactions lors
du redémarrage du système. Ce sont celles qui ont effectué leur COMMIT
avant la défaillance et dont les mises à jour n ’ont pas eu le temps d ’être
inscrites dans la base.
Pour effectuer ce travail, le système utilise le contenu du journal (log).
A certains intervalles prédéfinis, le système positionne un point de contrôle
(checkpoint) qui consiste :
à écrire physiquement (écriture forcée) le contenu des tampons en MC sur les
fichiers disque.
À écrire physiquement le compte-rendu du point de contrôle dans le journal
physique sur disque (log). Ce compte-rendu donne la liste de toutes les
transactions qui étaient en cours d ’exécution lors du positionnement du point
de contrôle.
1. Les transactions de type T1 sont terminées avec succès (commit) avant tc.
2. Les transactions de type T2 ont débuté avant tc, et se sont terminées avec
succès (commit) après tc et avant tf.
3. Les transactions de type T3 ont également débuté avant tc, mais ne se sont
pas terminées à la date tf.
4. Les transactions de type T4 ont débuté après tc, et se sont terminées avec
succès (commit) avant tf.
5. Les transactions de type T5 ont aussi débuté après tc, mais ne sesont pas
terminées à la date tf.
Il est clair que, lorsque le système est redémarré, les transactions de types T3
et T5 doivent être annulées, celles de types T2 et T4 doivent être rejouées. Les
T1 n’interviennent pas car leurs màj ont déjà été transférées sur disque lors du
chekpoint précédent (écriture forcée à la date tc).
Par conséquent, lors du redémarrage du système, la procédure suivante est
exécutée pour identifier les types de transactions T2 à T5:
Commencer par tenir 2 listes UNDO et REDO.
Initialiser la liste UNDO à toutes les transactions enregistrées dans le
compte-rendu du point de contrôle le plus récent avant la panne.
Initialiser la liste REDO à vide.
Faire une recherche en avant dans le journal en partant du point de Contrôle.
Si un COMMIT est rencontré, alors transférer la transaction T de la liste
UNDO vers REDO.
A la fin du journal, la liste UNDO contiendra les transactions de types T3et
T5. La liste REDO contiendra les transactions de types T2 et T4.
Puis le système effectue un parcours en arrière du journal, annulant
les transactions de la liste UNDO. Ensuite, il effectue à nouveau un parcours
en avant, rejouant les transactions de la liste REDO.
Remarque :
REDO UNDO