© Éditions Eyrolles
221
chapitre n° 3
Le niveau physique : de SQL2 à SQL3
(codedept VARCHAR(8), nomlogi VARCHAR(20), dateachat DATE,
CONSTRAINT pk_Achat PRIMARY KEY(codedept,nomlogi),
CONSTRAINT fk_Achat_dept FOREIGN KEY(codedept)
REFERENCES Departement(codedept),
CONSTRAINT fk_Achat_logi FOREIGN KEY(nomlogi)
REFERENCES Logiciel(nomlogi));
CREATE TABLE Utilisation
(codedept VARCHAR(8), nomserv VARCHAR(8),
CONSTRAINT pk_Utilisation PRIMARY KEY(codedept,nomserv),
CONSTRAINT fk_Utilisation_serv FOREIGN KEY(nomserv)
REFERENCES Serveur(nomserv),
CONSTRAINT fk_Utilisation_dept FOREIGN KEY(codedept)
REFERENCES Departement(codedept));
CREATE TABLE Installe
(nomserv VARCHAR(8), nomlogi VARCHAR(20),
CONSTRAINT pk_Installe PRIMARY KEY(nomserv,nomlogi),
CONSTRAINT fk_Installe_serv FOREIGN KEY(nomserv)
REFERENCES Serveur(nomserv),
CONSTRAINT fk_Installe_logi FOREIGN KEY(nomlogi)
REFERENCES Logiciel(nomlogi));
Le code suivant décrit deux insertions dans la table Installe (la première est correcte du fait
des données de l’exemple 3-25, la seconde, incohérente, est rejetée automatiquement par le
déclencheur).
CREATE TRIGGER tri_contrainte_inclusion
BEFORE INSERT ON Installe FOR EACH ROW
DECLARE
V1 VARCHAR(20);
V2 VARCHAR(8);
BEGIN
SELECT a.nomlogi,u.nomserv INTO v1,v2
FROM Achat a, Utilisation u
WHERE a.codedept = u.codedept
AND a.nomlogi = :NEW.nomlogi
AND u.nomserv = :NEW.nomserv;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20100, 'Le logiciel doit être
placé sur un serveur du département acheteur');
END;
221
chapitre n° 3
Le niveau physique : de SQL2 à SQL3
(codedept VARCHAR(8), nomlogi VARCHAR(20), dateachat DATE,
CONSTRAINT pk_Achat PRIMARY KEY(codedept,nomlogi),
CONSTRAINT fk_Achat_dept FOREIGN KEY(codedept)
REFERENCES Departement(codedept),
CONSTRAINT fk_Achat_logi FOREIGN KEY(nomlogi)
REFERENCES Logiciel(nomlogi));
CREATE TABLE Utilisation
(codedept VARCHAR(8), nomserv VARCHAR(8),
CONSTRAINT pk_Utilisation PRIMARY KEY(codedept,nomserv),
CONSTRAINT fk_Utilisation_serv FOREIGN KEY(nomserv)
REFERENCES Serveur(nomserv),
CONSTRAINT fk_Utilisation_dept FOREIGN KEY(codedept)
REFERENCES Departement(codedept));
CREATE TABLE Installe
(nomserv VARCHAR(8), nomlogi VARCHAR(20),
CONSTRAINT pk_Installe PRIMARY KEY(nomserv,nomlogi),
CONSTRAINT fk_Installe_serv FOREIGN KEY(nomserv)
REFERENCES Serveur(nomserv),
CONSTRAINT fk_Installe_logi FOREIGN KEY(nomlogi)
REFERENCES Logiciel(nomlogi));
Le code suivant décrit deux insertions dans la table Installe (la première est correcte du fait
des données de l’exemple 3-25, la seconde, incohérente, est rejetée automatiquement par le
déclencheur).
CREATE TRIGGER tri_contrainte_inclusion
BEFORE INSERT ON Installe FOR EACH ROW
DECLARE
V1 VARCHAR(20);
V2 VARCHAR(8);
BEGIN
SELECT a.nomlogi,u.nomserv INTO v1,v2
FROM Achat a, Utilisation u
WHERE a.codedept = u.codedept
AND a.nomlogi = :NEW.nomlogi
AND u.nomserv = :NEW.nomserv;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20100, 'Le logiciel doit être
placé sur un serveur du département acheteur');
END;
