CREATE TABLE mangone(id integer, val text, dt timestamptz);
CREATE FUNCTION suivi_mise_a_jour() RETURNS TRIGGER AS $BODY$
BEGIN
NEW.dt:= current_timestamp ;
RETURN NEW ;
END ;
$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER suivi_mise_a_jour BEFORE INSERT OR UPDATE ON mangone
FOR EACH ROW EXECUTE PROCEDURE suivi_mise_a_jour();
insert into mangone(id, val) values (1, 'test');
INSERT 0 1
select * from mangone;
id | val | dt
----+------+-------------------------------
1 | test | 2018-06-10 15:15:25.115889+02
(1 row)
Comme vous pouvez le voir, une insertion manuelle ne provoque pas de doublons. Vous faites donc quelquechose de mal, mais impossible de savoir quoi. Fournissez-nous un exemple complet pour que l'on sache exactement ce que vous faites, autrement on ne pourra pas aller plus loin.
]]>#!/bin/bash
#SCRIPT de sauvegarde de la table clients
#A exécuter en tant que postgres ou via "sudo -u postgres script.sh"
PGPATH="/usr/bin"
QUIET="-q"
#### TODO : VARIABLE A CHANGER SI BESOIN
CPV_DB_NAME="CORTEX" #Nom de la base de données cible
CPV_DB_PORT=5345 #Numéro de port associé au cluster
REST_D="./" #Dossier ou se trouve le .dump
function sql_query(){
sudo -u postgres psql -p "$CPV_DB_PORT" -d "$CPV_DB_NAME" -c "$1"
}
#1)Ajout de colonne dans la table clients
sql_query "Alter table clients add column mise_a_jour date;"
#2)mise en place des données de la colonne MAJ
sql_query "update clients set mise_a_jour =(select DETECTEDLAST from départements where oid=_oid and wid=_wid) where mise_a_jour is null;"
#3)Sauvegarde de la table clients
sudo ./dump_clients.sh
#4)Re-création de la nouvelle table clients
sql_query "alter table clients drop constraint fk723362laad036112";
sql_query "alter table clients rename to première_table_clients";
sql_query "create table clients (_oid int8 not null, _wid int8 not null, tracks_oid int8 not null, tracks_wid int8 not null, mise_a_jour date, primary key (_oid, _wid, tracks_oid, tracks_wid))";
#5)Remplissage de la table clients
sudo -u postgres pg_restore -p $CPV_DB_PORT -d $CPV_DB_NAME -a -F c -t clients --disable-triggers --verbose ./clients.dump
#7)Mise en place du nouvel index
sql_query "create index idx_clients_mise_a_jour on clients(mise_a_jour)" ;
sudo -u postgres psql -p $CPV_DB_PORT -d $CPV_DB_NAME -f ./trigger.sql
Commentaire : lorsque j'execute ce script basé sur la sauvegarde de la table clients, je n'ai aucun doublon.
Lorsque je fais une insertion manuelle sans passer par un dump de cette table, j'ai des doublons de toutes les lignes même au niveau des dates incrémenter dans cette nouvelle colonne .
Mon objectif est de ne pas dumper cet table, donc de ne pas restorer et par conséquent de ne pas avoir de doublons .
Merci par avance
]]>REATE OR REPLACE FUNCTION suivi_mise_a_jour()
RETURNS trigger AS
$BODY$
BEGIN
NEW.mise_a_jour:= current_date ;
RETURN NEW ;
END ;
$BODY$
LANGUAGE plpgsql;
Voici mes Triggers:
CREATE TRIGGER Before Insert_clients
BEFORE INSERT ON tracks_transmitter
FOR EACH ROW
EXECUTE PROCEDURE suivi_mise_a_jour();
CREATE TRIGGER BeforeUpdate_clients
BEFORE UPDATE ON tracks_transmitter
FOR EACH ROW
EXECUTE PROCEDURE suivi_mise_a_jour();
Ces 2 triggers fonctionnent correctement car elles remplissent la colonne mise_a_jour.
]]>Merci en tous cas pour l'aide
]]>J'ai pu régler le problème de la fonction trigger ainsi que les triggers before update et before insert.
Un petit rappel et une petite question pour finir cette expérience.
J'avais créé une colonne sur une table (colonne mise à jour) et créé une fonction trigger et 2 triggers qui à chaque fois qu'il ya un insert ou une mise à jour prend la date du jour et l'insère .
Question : si je pars d'un dump que je restore pas de soucis tout se passe bien pas de doublons. Si j' insère directement ( a la main ) les lignes sont doublées.
Pourquoi postgres se comporte ainsi ?
Comment faire pour ne pas avoir de doublons .
Merci une fois de plus pour votre aide .
]]>Merci pour vos aides. J'ai acquis de nouvelles connaissances sur les fonctions trigger ainsi que ls triggers.
testés, cela renvoie une entière satisfaction excepté juste une amélioration: Impossible de mettre à jour la table 'member' dans la fonction / trigger stockée
Fonction:
CREATE OR REPLACE FUNCTION suivi_mise_a_jour()
RETURNS trigger AS
$BODY$
BEGIN
NEW.mise_a_jour:= current_date ;
RETURN NEW ;
END ;
$BODY$
LANGUAGE plpgsql
Trigger:
CREATE TRIGGER BI_clients
BEFORE INSERT ON clients
FOR EACH ROW
if NEW.mise_a_jour is not null
EXECUTE PROCEDURE suivi_mise_a_jour();
Quelqu'un saurait ou est le problème ?
Merci d'avance
]]>Votre deuxième exemple n'a pas de sens. Vous ne pouvez pas faire une affectation ( := ) dans un test. Soit vous faites une affectation, soit vous faites un test. A priori, vous avez essayé de faire ce que vous recommandait Julien, mais ce n'était pas ça. Il indiquait que le test IF n'avait pas de sens. Cela donnerait donc le code suivant :
CREATE FUNCTION suivi_mise_a_jour() RETURNS TRIGGER AS $BODY$
BEGIN
NEW.date:= current_timestamp ;
RETURN NEW ;
END ;
$BODY$ LANGUAGE plpgsql;
CREATE FUNCTION suivi_mise_a_jour() RETURNS TRIGGER AS $BODY$
BEGIN
-- Insertion date de dernière mise à jour
IF NEW.date:= current_timestamp ;
RETURNS NEW ;
END IF;
$BODY$ LANGUAGE plpgsql
CREATE TRIGGER suivi_mise_a-jour BEFORE INSERT OR UPDATE ON ma_table
FOR EACH ROW EXECUTE PROCEDURE suivi_mise_a_jour);
Sinon, pourquoi ne pas créer et essayer le trigger pour vérifier qu'il fonctionne ?
]]>Merci pour les conseils.
Pouvez-vous me dire si cette fonction marchera avec mon trigger s'il vous plait ?
Si cela ne marche pas , que dois-je corriger ?
Merci d'avance pour votre aide .
Code
CREATE FUNCTION suivi_mise_a_jour() RETURNS TRIGGER AS $BODY$
BEGIN
-- Insertion date de dernière mise à jour
IF NEW.date IS NULL THEN
RAISE EXCEPTION NEW.date ne peut pas être NULL ;
END IF ;
NEW.date:= current_timestamp ;
RETURNS NEW ;
END ;
$BODY$ LANGUAGE plpgsql
CREATE TRIGGER suivi_mise_a-jour BEFORE INSERT OR UPDATE ON ma_table
FOR EACH ROW EXECUTE PROCEDURE suivi_mise_a_jour);