Configuration de pgAgent sous Windows
pgAgent est un planificateur de tâches pour PostgreSQL qui permet d’exécuter des scripts sans recourir au planificateur de tâches système. Les jobs que vous créez sont stockés dans le catalogue pgAgent de la base postgres !
Installation de pgAgent sous Windows
Avant d’installer pgAgent, créez le fichier %APPDATA%\postgresql\pgpass.conf, dans lequel vous ajoutez les paramètres de connexion à votre instance à l’image de l’exemple ci-dessous :
localhost:5432:postgres:postgres:postgres
Sous Windows, le logiciel s’installe avec l’installeur fourni par EDB après qu’il a été téléchargé via le gestionnaire de paquets StackBuilder fourni par EDB.
Modifier les paramètres de lancement du service pgAgent
Par défaut, sous Windows, l’accès local à la base exige que vous saisissiez votre mot de passe. C’est la raison pour laquelle vous pourriez être amené à modifier, dans le registre au niveau de la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\pgAgent\ImagePath, les paramètres de lancement du service pgAgent en y ajoutant le mot de passe. En fait, cela dépend de la configuration de votre fichier pg_hba.conf.
C:\PROGRA~2\pgAgent\bin\pgagent.exe RUN pgAgent host=localhost port=5432 user=postgres password=postgres dbname=postgres
Puis, vous devez redémarrer le service.
net stop pgagent net start pgagent
Pas terrible au niveau sécurité, n’est-ce pas ?
Création du job pgAgent
J’ai rencontré un bogue majeur sous la version pgAdmin 4, lors de la création du job, au niveau de la planification. Préférez la saisie des dates à l’utilisation des agendas qui fige pgAdmin 4 et qui vous oblige à terminer la tâche.
Le code SQL de création de la tâche planifiée
Une fois créé, faites un clic droit au niveau du job et choisissez CREATE SCRIPT. Dans le code suivant qui consiste à insérer la date du jour dans la table test du schéma public de la base test, le job s’exécute toutes les heures +1 minute !
DO $$ DECLARE jid integer; scid integer; BEGIN --Code SQL pour supprimer les jobs existants --DELETE FROM pgagent.pga_job; --DELETE FROM pgagent.pga_jobstep; --DELETE FROM pgagent.pga_schedule; -- Creating a new job INSERT INTO pgagent.pga_job( jobjclid, jobname, jobdesc, jobhostagent, jobenabled ) VALUES ( 1::integer, 'job_test'::text, ''::text, ''::text, true ) RETURNING jobid INTO jid; -- Steps -- Inserting a step (jobid: NULL) INSERT INTO pgagent.pga_jobstep ( jstjobid, jstname, jstenabled, jstkind, jstconnstr, jstdbname, jstonerror, jstcode, jstdesc ) VALUES ( jid, 'step_test'::text, true, 's'::character(1), ''::text, 'test'::name, 'f'::character(1), 'INSERT INTO public.test VALUES(NOW());'::text, ''::text ) ; -- Schedules -- Inserting a schedule INSERT INTO pgagent.pga_schedule( jscjobid, jscname, jscdesc, jscenabled, jscstart, jscend, jscminutes, jschours, jscweekdays, jscmonthdays, jscmonths ) VALUES ( jid, 'schedule_test'::text, ''::text, true, '2017-07-03 21:05:00+02'::timestamp with time zone, '2099-07-31 20:30:00+02'::timestamp with time zone, -- Minutes ARRAY[false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]::boolean[], -- Hours ARRAY[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]::boolean[], -- Week days ARRAY[false, false, false, false, false, false, false]::boolean[], -- Month days ARRAY[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]::boolean[], -- Months ARRAY[false, false, false, false, false, false, false, false, false, false, false, false]::boolean[] ) RETURNING jscid INTO scid; END $$;