UML 2 pour les bases de données
188
© Éditions Eyrolles
SQL> INSERT INTO pilote VALUES ('3MPY93', 'Tuffery', 32, 'CAST');
ERREUR à la ligne 1 :
ORA-00001: violation de contrainte unique (SOUTOU.PK_PILOTE)
SQL> INSERT INTO pilote VALUES ('1MPY93', 'Tuffery', 32, 'RIEN');
ERREUR à la ligne 1 :
ORA-02291: violation de contrainte (SOUTOU.FK_PILOTE_COMPA_COMPAGNIE) d'intégrité - touche parent introuvable
SQL> INSERT INTO pilote VALUES ('1MPY93', 'Tuffery', 62, 'CAST');
ERREUR à la ligne 1 :
ORA-02290: violation de contraintes (SOUTOU.CK_AGE_PILOTE) de
vérification
Notons que le SGBDR renvoie chaque fois une erreur, qui évite au programmeur de prendre
en compte toute une série de tests. Avec Oracle, le nom de la contrainte est préfixé par le nom
du propriétaire de la table sur laquelle se porte cette contrainte (ici l’utilisateur Soutou).
Intégrité référentielle
L’intégrité référentielle, mise en œuvre à l’aide des clés étrangères, est l’une des caractéristiques
majeures des SGBD. Elle permet d’assurer la cohérence d’une base de données.
Dans notre exemple, il était incorrect d’insérer un pilote d’une compagnie non référencée dans
la base. Il est tout aussi incorrect de vouloir supprimer une compagnie à laquelle des pilotes
sont rattachés. La suppression d’une compagnie est envisageable en effectuant en contrepartie
des actions compensatoires, comme modifier tous les pilotes qui dépendent de cette compagnie
(en affectant la valeur nulle à la colonne compa) ou en supprimer tous les pilotes concernés !
Ces actions peuvent être définies avec la directive CASCADE et sont déclarées avec la table
concernée comme une contrainte.
Dans notre exemple, nous n’avons pas pris en compte de telles contraintes. La suppression d’une
compagnie ayant des pilotes entraîne donc l’incohérence de la base. Le script suivant montre
qu’Oracle gère intrinsèquement l’intégrité référentielle.
-- Modif de la compagnie du premier pilote
SQL> UPDATE pilote SET compa = 'AOM' WHERE brevet = '3MPY93';
ERREUR à la ligne 1 :
ORA-02291: violation de contrainte (SOUTOU.FK_PILOTE_COMPA_COMPAGNIE) d'intégrité - touche parent introuvable
--Suppression d'une compagnie ayant des pilotes
SQL> DELETE FROM compagnie WHERE comp = 'AF';
ERREUR à la ligne 1 :
ORA-02292: violation de contrainte (SOUTOU.FK_PILOTE_COMPA_
COMPAGNIE) d'intégrité – enregistrement fils existant
Dans le premier message d’erreur, Oracle signale qu’un fils n’a pas de père. Dans le second
message, il signale qu’un père possède un fils.
Précédent

- 194/316

Suivant