IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

38.5. Un exemple de trigger sur événement de table modifiée

Grâce à l'événement table_rewrite, il est possible d'écrire une fonction qui autorise les modifications d'une table seulement pendant les heures de maintenance.

Ci-dessous un exemple d'implémentation d'une telle règle.

CREATE OR REPLACE FUNCTION pas_de_modification()
 RETURNS event_trigger
 LANGUAGE plpgsql AS
$$
---
--- Implémentation d'une règle de modification de table:
---  pas de modifications de public.foo, les
---  autres tables peuvent l'être entre 01:00 et 06:00 du matin
---  sauf si elles ont plus de 100 blocs
---
DECLARE
  table_oid oid := pg_event_trigger_table_rewrite_oid();
  heure_courante integer := extract('hour' from current_time);
  pages integer;
  max_pages integer := 100;
BEGIN
  IF pg_event_trigger_table_rewrite_oid() = 'public.foo'::regclass
  THEN
        RAISE EXCEPTION 'Vous n''êtes pas autorisé à modifier la table %',
                        table_oid::regclass;
  END IF;

  SELECT INTO pages relpages FROM pg_class WHERE oid = table_oid;
  IF pages > max_pages
  THEN
        RAISE EXCEPTION 'les modifications ne sont seulement permises que pour les tables ayant un nombre de blocs inférieur à %',
                        max_pages;
  END IF;

  IF heure_courante NOT BETWEEN 1 AND 6
  THEN
        RAISE EXCEPTION 'les modifications sont seulement autorisées entre 01:00 et 06:00 du matin';
  END IF;
END;
$$;

CREATE EVENT TRIGGER pas_de_modifications_permises
                  ON table_rewrite
   EXECUTE PROCEDURE pas_de_modification();