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?
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