PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/04/2013 10:22:29

jacques
Membre

TRIGGER déclencheur d'une commande système

Bonjour,

Le problème qui m'amène à ouvrir cette discussion est le suivant :
lancer, une commande système (par exemple exécuter un programme, un script Linux shell ou bien créer un fichier) lorsqu'une table est mise à jour (insertion d'une ligne ou modification de la valeur d'une colonne) ou bien lorsque la valeur d'une colonne de type date devient égale à la date système.
On peut donc penser tout naturellement à un TRIGGER.
Mais, il semble que PostgreSQL ne soit pas destiné à lancer des commandes système.
Dans au moins un autre SGBD du marché, il existe une façon de lancer une commande système à partir du client SQL (l'équivalent de psql), mais je n'ai pas trouvé l'équivalent sous PostgreSQL, y en a-t-il un ?

Par exemple, pourrait-on, à l'aide d'un déclencheur (TRIGGER) sur l'évènement INSERT ou UPDATE de la colonne de la table spécifiée, lancer l'action (lancement de la commande système) à l'aide d'une fonction en langage C (C-Language Function) qui serait utilisé en tant que langage procédural associé au déclencheur ou par un autre moyen ?

Est-ce qu'un trigger peut déclencher un job de PgAgent ?

Pourrait-on envisager qu'une tâche (Job) de PgAgent aille, en première étape à l'aide d'une requête SQL, consulter la valeur d'une ligne/colonne d'une table et en fonction du résultat, lance, en deuxième étape la commande système ?

Cordialement

Hors ligne

#2 10/05/2013 09:17:11

KrysKool
Administrateur

Re : TRIGGER déclencheur d'une commande système

Bonjour

PostgreSQL tourne bien souvent avec un utilisateur qui a des droits restreints, donc lancer un script shell peut être problématique. je vois plusieurs solutions pour arriver à un résultat satisfaisant

1) Utilisation de LISTEN/NOTIFY votre Trigger va déclencher un NOTIFY, et un service (codé dans le langage de votre choix) va surveiller à intervalle régulier si des changements sont intervenus, et lancer le cas échéant le script

2) En PLPython il doit être possible d'utiliser le module subprocess pour lancer une commande, vu qu'il est UNTRUSTED

3) Utiliser l'extension PostgreSQL AMQP https://github.com/omniti-labs/pg_amqp qui necéssite un serveur AMQP (RabbitMQ) avec lequel vous enverrez un message en mode point à point ou diffusé. en face vous aurez un script relié à RabbitMQ qui va lancer un traitement dès réception d'un message, l'avantage de cette extension est que lors du publish le message n'est pas envoyé de suite, mais seulement au commit, si un rollback est effectué alors le message n'est pas envoyé alors même que l'on a appellé le publish().


Christophe Chauvet
Directeur Technique
Sylëam Info Services
Mon site

Hors ligne

Pied de page des forums