web-dev-qa-db-fra.com

Un déclencheur pour plusieurs tables

j'ai une gâchette dans PostgreSQL 9.1 que je souhaite tirer sur des inserts de plusieurs tables. Est-il possible de l'avoir affecter toutes ces tables au lieu de créer la gâchette pour toutes ces tables? J'ai 58 tables que je veux utiliser le même déclencheur d'insertion qui appelle une fonction de déclenchement, alors j'ai utilisé

create trigger tuweke 
after insert on product 
for each row execute procedure tuwekeAdjustextract(); 
create trigger tuweke 
after insert on caneweightment 
for each row execute procedure tuwekeAdjustextract(); 
...

faire cela pour toutes ces tables, puis nous avons plusieurs schémas, la charge de travail est donc beaucoup, peut-elle être faite dans une requête? Ensuite, affectez-vous toutes les tables de ce schéma ou de toute la base de données?

5
indago

Il n'y a pas d'option comme ça. Un déclencheur appartient à une table et c'est ça. Toutefois, si tous vos déclencheurs utilisent la même procédure, vous pouvez facilement générer une belle sortie de texte avec tous les CREATE TRIGGER déclarations. La seule chose à faire est de collecter les noms de table souhaités, puis de préparer et d'affirmer les pièces nécessaires à ceux-ci.

Vous pouvez obtenir tous les noms de table d'un schéma donné avec une requête comme celle-ci:

SELECT p.tablename
FROM pg_tables p
WHERE p.schemaname = 'public'
;

Si maintenant vous sélectionnez

'CREATE TRIGGER tuweke 
AFTER INSERT ON ' || p.tablename || '
FOR EACH ROW EXECUTE PROCEDURE tuwekeAdjustextract();
'

à la place de p.tablename alors vous êtes prêt. Copiez la sortie et exécutez-la.

8
dezso