L3 Info : SGBD
 
◃  Ch. 11 PL/pgSQL  ▹
 

Les triggers INSTEAD OF

  • Triggers dédiés aux vues pour les rendre éditables par INSERT, UPDATE et DELETE
  • Retournent toujours NULL
  • Toujours déclenchés BEFORE et FOR EACH ROW
  • Exemple :
    • 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          |
      +--------+-----------+-------+--------------+