Documentation PostgreSQL 14.22 » Programmation serveur » Déclencheurs (triggers) sur événement » Un exemple de trigger sur événement de table modifiée

Précédent | Niveau supérieur | Suivant
40.4. Un exemple complet de trigger sur événement | Sommaire | Chapitre 41. Système de règles

## 40.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 FUNCTION pas_de_modification();