web-dev-qa-db-fra.com

Comment réutiliser une mise à jour de la gâchette pour plusieurs tables dans PostgreSQL?

Dans la base de données pour un nouveau projet, j'ai commencé la convention d'avoir chaque table avoir une dernière colonne d'horodatage modifiée. Pour mettre en œuvre cela, j'ai écrit une gâchette pour chaque table:

CREATE TRIGGER touch_users
  BEFORE UPDATE
  ON users
  FOR EACH ROW
  WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
  EXECUTE PROCEDURE touch_modification_time();

CREATE TRIGGER touch_company
  BEFORE UPDATE
  ON company
  FOR EACH ROW
  WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
  EXECUTE PROCEDURE touch_modification_time();

-- etc for each table

Cela devient fastidieux assez rapidement; Surtout comme ils sont exactement les mêmes, à l'exception du nom de la table.

Y a-t-il une façon de réduire la chaudière requise pour chaque table? Ou peut-être même l'éliminer complètement avec un seul déclencheur qui agit sur chaque table par défaut?

4
pimlottc

Fonction de déclenchement unique pour plusieurs déclencheurs: possibles - c'est ce que vous faites.
Déclencheur unique pour plusieurs tables: non possible.

Mais vous pouvez raccourcir le code pour créer de nombreux déclencheurs:

DO
$$
BEGIN

EXECUTE (
SELECT string_agg('CREATE TRIGGER touch_users
   BEFORE UPDATE ON ' || quote_ident(t) || '
   FOR EACH ROW
   WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
   EXECUTE PROCEDURE touch_modification_time();'
 , E'\n')
FROM unnest('{users, company, foo, bar}'::text[]) t -- list your tables here
);

END
$$;

Ou recueillir des noms de table à partir de catalogues système:
[.____] tables accessibles au cours de la dernière période

4
Erwin Brandstetter