- Vue Responsable Diplome
CREATE VIEW ResponsableDiplome AS SELECT prof_nom, prof_prenom, dip_nom, dip_discipline FROM professeur NATURAL JOIN diplome;
SELECT * FROM ResponsableDiplome;
+--------+-----------+-------+--------------+
|prof_nom|prof_prenom|dip_nom|dip_discipline|
+--------+-----------+-------+--------------+
|Jay |Véronique |Licence|Informatique |
|Amanton |Laurent |Master |Informatique |
+--------+-----------+-------+--------------+
- Tentative d'édition de la vue :
UPDATE ResponsableDiplome SET dip_discipline = 'Info' WHERE dip_discipline = 'Informatique';
[55000] ERROR: cannot update view "responsablediplome"
Détail : Views that do not select from a single table or view are not automatically updatable.
Indice : To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.
- Mise en place d'un trigger dédié :
CREATE OR REPLACE FUNCTION tg_for_view() RETURNS trigger AS $$
BEGIN
IF NEW.dip_discipline <> OLD.dip_discipline THEN
UPDATE diplome SET dip_discipline=NEW.dip_discipline
WHERE dip_nom=OLD.dip_nom AND dip_discipline = OLD.dip_discipline;
END IF;
RETURN NULL; -- on ne renvoie rien à modifier dans la vue
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER tg_resp_dip INSTEAD OF UPDATE ON ResponsableDiplome
FOR EACH ROW
EXECUTE PROCEDURE tg_for_view();
- Résultat :
UPDATE ResponsableDiplome SET dip_discipline = 'Info' WHERE dip_discipline = 'Informatique';
SELECT * FROM ResponsableDiplome;
+--------+-----------+-------+--------------+
|prof_nom|prof_prenom|dip_nom|dip_discipline|
+--------+-----------+-------+--------------+
|Jay |Véronique |Licence|Info |
|Amanton |Laurent |Master |Info |
+--------+-----------+-------+--------------+