Académique Documents
Professionnel Documents
Culture Documents
TP SQL (Correctif)
TP SQL (Correctif)
Travaux pratiques
SQL
Trouver, dans la table suivante, les utilisateurs ayant le même nom et la même adresse email.
Users
ID Name Email
1 John john@student.unamur.be
2 Sam tom@student.unamur.be
3 Tom tom@student.unamur.be
4 Tom bob@student.unamur.be
5 Tom tom@student.unamur.be
Output attendu :
Ajouter, dans la table précédente, une nouvelle colonne de type INT avec une valeur par défaut.
Exemple de résultat :
Users
ID Name Email Age
1 John john@student.unamur.be 20
2 Sam tom@student.unamur.be 20
3 Tom tom@student.unamur.be 20
4 Tom bob@student.unamur.be 20
5 Tom tom@student.unamur.be 20
Peste
Il faut éviter les insert et update sur la table R afin de garantir la DF CPOST->VILLE
Selon cette DF on ne peut pas insert la ligne : "Rue Royale, Bruxelles, 5000". Il est également interdit
de modifier le CPOST de la Rue des Brasseurs à 5000.
Choléra
Appendix 1
Peste et choléra
Si l’on ajoute la ligne Rue de la Montagne, Charleroi, 6000 dans la table rue la règle d’inclusion n’est
plus respectée.
alter table post_pstnchol.ville add unique (cpost, ville);
alter table post_pstnchol.rue add foreign key (cpost, ville)
references post_pstnchol.ville(cpost, ville);
Donnez la liste exhaustive des événements de la base de données pouvant potentiellement mener
à la violation de la contrainte ci-dessous.
Contrainte : Une commande d’un client de Namur ne peut pas comporter plus de 2 détails.
• Insertion d’un 3ème détail pour une commande passée par un client de Namur
• Mise à jour de la colonne Orders.cli_id afin de référencer un client de Namur pour une
commande avec plus de 2 détails.
• Mise à jour de la colonne Details.ord_id afin de référencer une commande ayant déjà 2 détails
et appartenant à un client de Namur.
• Mise à jour de la localité d’un client de venant pas de Namur et ayant déjà passé une commande
avec plus de 2 détails.
Créer deux triggers, de type after et before pour deux de ces événements.
Insertion d’un 3ème détail d’une commande passée par un client vivant à Namur, la contrainte sera
violée
create or replace function customers.check_insert() returns trigger as
$$ begin
if ((select count(*) from customers.customers CUS, customers.orders ORD,
customers.details DET
where DET.order_id = ORD.id
and ORD.user_id = CUS.id
and CUS.city = 'Namur'
and ORD.id = new.order_id) >= 2)
then
raise exception 'the maximal number of details per order (2) is reached';
end if;
return new;
end $$
language plpgsql;
-- Mise à jour de la colonne Orders.user_id afin de référencer un client de Namur pour une
commande avec plus de 2 détails.
create or replace function customers.check_update_order() returns trigger as
$$ begin
if ((select city from customers.customers where id = new.user_id) = 'Namur' and
(select count(*) from customers.details where order_id = new.id) > 2)
then
raise exception 'the maximal number of details per order (2) is reached';
end if;
return new;
end $$
language plpgsql;
Mise à jour de la colonne Details.ord_id afin de référencer une commande ayant déjà 2 détails et
appartenant à un client de Namur.
create or replace function customers.check_update_detail() returns trigger as
$$ begin
if ((select count(*)
from customers.customers CUS, customers.orders ORD, customers.details DET
where DET.order_id = ORD.id
and ORD.user_id = CUS.id
and CUS.city = 'Namur'
and ORD.id = new.order_id
) >= 2)
then
raise exception 'the maximal number of details per order (2) is reached';
end if;
return new;
end $$
language plpgsql;