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 24/01/2012 21:17:00

Morby
Membre

un dernier trigger pour la route

salut à tous, le Morby des montagnes est de retour avec un nouveau trigger

mes tables :

CREATE TABLE LGPUTILS
       (NUMUSER SERIAL,
        NOM VARCHAR(25) PRIMARY KEY,
	PASSWORD VARCHAR(25) NOT NULL,
	NBARTICLECREE INTEGER DEFAULT '0');

CREATE VIEW LGPUSERNEW AS SELECT * FROM LGPUTILS;
grant select on LGPUSERNEW to public;
grant insert on LGPUSERNEW to public;
grant update on LGPUSERNEW to public;
grant delete on LGPUSERNEW to public;
CREATE TABLE LGPSUJET
       (NUMSUJET SERIAL PRIMARY KEY,
	AUTEUR VARCHAR(25) REFERENCES LGPUTILS (NOM),
	TITRE VARCHAR NOT NULL,
	DATEPARUTION DATE DEFAULT current_date,
	DATEMODIF DATE DEFAULT current_date,
	AUTEURMODIF VARCHAR(25) REFERENCES LGPUTILS (NOM),
	NUMBACKUP INTEGER DEFAULT '1',
	NBVUE INTEGER DEFAULT '0',
	TEXTE VARCHAR NOT NULL,
	PROTECTION INTEGER DEFAULT '1'	);

CREATE VIEW ALLSUJET AS SELECT * FROM LGPSUJET;
grant select on ALLSUJET to public;
grant insert on ALLSUJET to public;
grant update on ALLSUJET to public;
CREATE TABLE LGPAUTH
       (NUMSUJET INTEGER REFERENCES LGPSUJET (NUMSUJET),
        AUTEUR VARCHAR(25) REFERENCES LGPUTILS (NOM),
	AUTORISEDTOMODIF VARCHAR(25) );

ALTER TABLE LGPAUTH ADD PRIMARY KEY ( NUMSUJET, AUTORISEDTOMODIF);
grant insert on LGPAUTH to public;
grant delete on LGPAUTH to public;
grant select on LGPAUTH to public;

CREATE VIEW AUTORIS AS SELECT * FROM LGPAUTH;
grant insert on AUTORIS to public;
grant delete on AUTORIS to public;
grant select on AUTORIS to public;
DROP TABLE LGPBAK CASCADE;
CREATE TABLE LGPBAK
	(NUMBACKUP INTEGER,
	NUMSUJET INTEGER REFERENCES LGPSUJET (NUMSUJET),
	AUTEUR VARCHAR(25) REFERENCES LGPUTILS (NOM),
	TITRE VARCHAR,
	DATEMODIF DATE,
	AUTEURMODIF VARCHAR(25),
	TEXTE VARCHAR);

CREATE VIEW BACKSUJET AS SELECT * FROM LGPBAK;
grant select on BACKSUJET to public;
grant insert on BACKSUJET to public;
grant delete on BACKSUJET to public;

_____________________________________________________________


et voici le trigger qui me pose problème :

---- TRIGGER = update sur les sujets publiés
CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;
BEGIN
-- ****** verification de propriete du sujet ou de l'autorisation de modification *******
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifier si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- *** archivage de l'ancienne version du sujet dans la table Backup *** 
	INSERT INTO BACKSUJET 
	(NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,NUMBACKUP,TEXTE)
	SELECT (OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
	OLD.AUTEURMODIF, OLD.NUMBACKUP, OLD.TEXTE)
	FROM ALLSUJET
	WHERE NUMSUJET=NEW.ALLSUJET;

	-- *** test sur le nombre de sauvegarde du sujet ***
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
		DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet;
		END IF;

	-- *** update du sujet dans la table ALLSUJET avec les nouvelles valeurs***
	--   + date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		OLD.titre = NEW.titre ,
		OLD.datemodif = current_date,
		OLD.auteurmodif = current_user ,
		OLD.numbackup = OLD.numbackup+1,
		OLD.texte = NEW.texte
		WHERE OLD.NUMSUJET = NEW.NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fonction_autobackup 
INSTEAD OF UPDATE ON ALLSUJET
FOR EACH ROW EXECUTE PROCEDURE fonction_autobackup();

le message d'erreur :

postgres=> UPDATE ALLSUJET SET titre = 'test UPDATE1' WHERE numsujet=2;

ERREUR:  l'enregistrement « new » n'a pas de champs « allsujet »
CONTEXTE : SQL statement "INSERT INTO BACKSUJET 
(NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,NUMBACKUP,TEXTE)
SELECT (OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
OLD.AUTEURMODIF, OLD.NUMBACKUP, OLD.TEXTE)
FROM ALLSUJET
WHERE NUMSUJET=NEW.ALLSUJET"
fonction PL/pgsql « fonction_autobackup », ligne 20 à instruction SQL

je dois rendre mon projet demain, je bosse là dessus depuis 17h et je tourne en rond, la panique me gagne doucement et je ne comprend pas le message d'erreur

help please

Dernière modification par Morby (26/01/2012 11:51:43)

Hors ligne

#2 24/01/2012 23:03:50

gleu
Administrateur

Re : un dernier trigger pour la route

Le message est clair pourtant. Le trigger essaie de faire un INSERT à partir d'un SELECT qui filtre sur NEW.ALLSUJET. Or il n'existe pas de colonne ALLSUJET dans la ligne NEW.


Guillaume.

Hors ligne

#3 24/01/2012 23:16:24

Morby
Membre

Re : un dernier trigger pour la route

houlala, je suis fatigué moi, à force de retourner le prb dans tout les sens je deviens aveugle...

maintenant j'ai un nouveau probleme de syntaxe :

CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;
BEGIN
-- ****** verification de propriete du sujet ou de l'autorisation de modification *******
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifier si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- archivage du sujet modifié
	INSERT INTO BACKSUJET 
	(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
	SELECT (OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
	OLD.AUTEURMODIF, OLD.TEXTE)
	FROM ALLSUJET
	WHERE NUMSUJET=NEW.NUMSUJET;

	-- test sur le nombre de sauvegarde du sujet
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
		DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet;
		END IF;

	-- update du sujet 
	-- avec date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		OLD.titre = NEW.titre ,
		OLD.datemodif = current_date,
		OLD.auteurmodif = current_user ,
		OLD.numbackup = OLD.numbackup+1,
		OLD.texte = NEW.texte
		WHERE OLD.NUMSUJET = NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

l'erreur :
postgres=> UPDATE ALLSUJET SET titre = 'test UPDATE1' WHERE numsujet=2;

ERREUR:  INSERT a plus de colonnes cibles que d'expressions
LIGNE 2 : (NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE...
                     ^
ASTUCE : La source d'insertion est une expression de ligne contenant le même nombre
de colonnes que celui attendu par INSERT. Auriez-vous utilisé des parenthèses
supplémentaires ?
REQUÊTE : INSERT INTO BACKSUJET
(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
SELECT (OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF,
OLD.AUTEURMODIF, OLD.TEXTE)
FROM ALLSUJET
WHERE NUMSUJET=NEW.NUMSUJET
CONTEXTE : PL/pgSQL function "fonction_autobackup" line 20 at instruction SQL


toutes les parenthèses ouvertes sont fermées, et sans parenthèses ça veut pas marcher non plus...
un indice ?

Hors ligne

#4 24/01/2012 23:44:25

gleu
Administrateur

Re : un dernier trigger pour la route

Il faut supprimer les parenthèses après le SELECT et avant le FROM.


Guillaume.

Hors ligne

#5 24/01/2012 23:57:16

Morby
Membre

Re : un dernier trigger pour la route

bizarre, j'avais pourtant essayé de les supprimer et ça n'avait pas fonctionné... peut etre m'étais-je trompé de requete :s
depuis j'ai corrigé une autre erreur (auteurmodif était déclaré en integer au lieu de varchar, vestige d'une ancienne version avant que je change la PK avec le nom d'auteur plutot que son n°)

et maintenant je tombe sur un nouveau probleme :

voila la nouvelle version du trigger :

CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;
BEGIN
-- ****** verification de propriete du sujet ou de l'autorisation de modification *******
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifier si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- archivage du sujet modifié
	INSERT INTO LGPBAK 
	(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
	SELECT OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
	OLD.AUTEURMODIF, OLD.TEXTE
	FROM ALLSUJET
	WHERE NUMSUJET=NEW.NUMSUJET;

	-- test sur le nombre de sauvegarde du sujet
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
		DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet;
		END IF;

	-- update du sujet 
	-- avec date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		titre = NEW.titre ,
		datemodif = current_date,
		auteurmodif = current_user,
		numbackup = numbackup+1,
		texte = NEW.texte
		WHERE NUMSUJET = NEW.NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fonction_autobackup 
INSTEAD OF UPDATE ON ALLSUJET
FOR EACH ROW EXECUTE PROCEDURE fonction_autobackup();

et nouvelle erreur :

postgres=> UPDATE ALLSUJET SET titre = 'test UPDATE1' WHERE numsujet=2;

ERREUR:  la valeur d'une clé dupliquée rompt la contrainte unique « lgpbak_numbackup_key »
DÉTAIL : La clé « (numbackup)=(1) » existe déjà.
CONTEXTE : instruction SQL « INSERT INTO LGPBAK
(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
SELECT OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF,
OLD.AUTEURMODIF, OLD.TEXTE
FROM ALLSUJET
WHERE NUMSUJET=NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 20 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user ,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL


pourtant j'incrémente de 1 la valeur de NUMBACKUP lors de l'update dans la table des sujets, et la table des backup est vide....

Dernière modification par Morby (25/01/2012 00:26:56)

Hors ligne

#6 25/01/2012 20:55:36

Morby
Membre

Re : un dernier trigger pour la route

je ne m'en sort toujours pas avec ce trigger, j'y ai passé tout mon aprem et tjrs pas de résultat
help please

Hors ligne

#7 25/01/2012 21:36:20

rjuju
Administrateur

Re : un dernier trigger pour la route

Bonjour.
Le problème vient de la contrainte d'unicité sur NUMBACKUP de la table ALLSUJET, et non sur la table LGPBACK.

Je pense que vous pouvez avoir 2 sujets avec un même numéro de backup. Il faudrait définir l'unicité sur le couple (NUMSUJET,NUMBACKUP) de la table ALLSUJET

Hors ligne

#8 25/01/2012 22:06:33

Morby
Membre

Re : un dernier trigger pour la route

je n'avais pas du tout pensé à ça, surtout que la table LGPBACK était vide... merci bcp pour le renseignement wink

Hors ligne

#9 25/01/2012 22:27:56

Morby
Membre

Re : un dernier trigger pour la route

bon ben je n'y arrive toujours pas... pour tester j'ai enlevé la contrainte UNIQUE et meme pas mis de PK :

CREATE TABLE LGPBAK
	(NUMBACKUP INTEGER,
	NUMSUJET INTEGER REFERENCES LGPSUJET (NUMSUJET),
	AUTEUR VARCHAR(25) REFERENCES LGPUTILS (NOM),
	TITRE VARCHAR,
	DATEMODIF DATE,
	AUTEURMODIF VARCHAR(25),
	TEXTE VARCHAR	
	);

grant select on LGPBAK to public;
grant insert on LGPBAK to public;
grant delete on LGPBAK to public;

CREATE VIEW BACKSUJET AS SELECT * FROM LGPBAK;
grant select on BACKSUJET to public;
grant insert on BACKSUJET to public;
grant delete on BACKSUJET to public;	

--------------------------------------------------

-- TRIGGER = archivage des sujets modifiés
CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;

BEGIN
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifie si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- archivage du sujet modifié
	INSERT INTO LGPBAK 
		(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
		SELECT OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
		OLD.AUTEURMODIF, OLD.TEXTE
		FROM ALLSUJET
		WHERE NUMSUJET=NEW.NUMSUJET;
	-- test sur le nombre de sauvegarde du sujet
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
		DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet;
		END IF;
	-- update du sujet 
	-- avec date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		titre = NEW.titre ,
		datemodif = current_date,
		auteurmodif = current_user,
		numbackup = numbackup+1,
		texte = NEW.texte
		WHERE NUMSUJET = NEW.NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fonction_autobackup 
INSTEAD OF UPDATE ON ALLSUJET
FOR EACH ROW EXECUTE PROCEDURE fonction_autobackup();
UPDATE ALLSUJET SET titre = 'test UPDATE' WHERE numsujet=2;


ERREUR:  agrégats non autorisés dans une clause WHERE
LIGNE 1 : DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.nu...
                                             ^
REQUÊTE : DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet
CONTEXTE : PL/pgSQL function "fonction_autobackup" line 31 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL

pffff, j'ai le cerveau tout vide à force...

Hors ligne

#10 25/01/2012 22:41:58

rjuju
Administrateur

Re : un dernier trigger pour la route

il faut réécrire la requête

DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.numsujet=new.numsujet;

je pense que

DELETE FROM lgpbak WHERE numbackup=(SELECT MIN(numbackup) FROM lgpbak where numsujet = old.numsujet) AND old.numsujet=new.numsujet;

devrait fonctionner.

Hors ligne

#11 25/01/2012 22:42:59

gleu
Administrateur

Re : un dernier trigger pour la route

Vous lisez les messages d'erreur de temps en temps ?

ERREUR:  agrégats non autorisés dans une clause WHERE
LIGNE 1 : DELETE FROM lgpbak WHERE numbackup=MIN(numbackup) AND old.nu...

Ça m'a tout l'air de vouloir dire que vous ne pouvez pas utiliser MIN() dans une clause WHERE. Ce qui n'est pas étonnant du tout. Bref, il faut réécrire votre DELETE sans le MIN().


Guillaume.

Hors ligne

#12 25/01/2012 22:59:20

Morby
Membre

Re : un dernier trigger pour la route

rjuju > merci pour la correction

gleu > désolé mais ça m'a échappé, le message d'erreur était long et j'avoue que ce trigger commence sérieusement à me sortir par les yeux, 2 jours que je suis dessus. d'autre part à l'issue de ma formation je ne compte pas devenir dba. néanmoins j'ai déjà foiré le devoir sur Oracle, j'ai donc besoin d'une note correcte sur ce projet (que je devais rendre déjà hier) raison pour laquelle je m'acharne à le finir.

---------------

en parlant de message d'erreur à rallonge, en voici un qui rempli la console (désolé mais j'ai pas le début) :

datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL
instruction SQL « UPDATE ALLSUJET SET 
titre = NEW.titre ,
datemodif = current_date,
auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET »
PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL

il semble que ce soit une erreur de boucle, mais je vois pas où ça boucle... pfff j'en ai marre

Dernière modification par Morby (25/01/2012 22:59:57)

Hors ligne

#13 25/01/2012 23:10:40

rjuju
Administrateur

Re : un dernier trigger pour la route

Votre mise à jour du sujet se fait en sql et non en code. Votre trigger l'intercepte et se relance donc en boucle.

Vous pouvez utiliser directement les champs de new pour éviter cela.
ex :
        NEW.datemodif := current_date;
        NEW.auteurmodif := current_user;
etc

Hors ligne

#14 25/01/2012 23:14:12

gleu
Administrateur

Re : un dernier trigger pour la route

en parlant de message d'erreur à rallonge, en voici un qui rempli la console (désolé mais j'ai pas le début) :

Dommage, c'est le début l'essentiel. Là, vous avez plusieurs fois le même message sans erreur. On ne peut rien faire avec ça.


Guillaume.

Hors ligne

#15 25/01/2012 23:25:42

Morby
Membre

Re : un dernier trigger pour la route

j'ai mis un NEW partout mais j'avais une erreur pour le TITRE
de meme les ":=" provoquaient une erreur lors de l'insertion du trigger, c'est pas plutot une syntaxe Oracle ?

bref, j'ai enlevé les NEW et n'ai gardé que ceux sur la datemodif et auteurmodif, voici l'erreur que ça me retourne

 UPDATE ALLSUJET SET titre = 'test UPDATE' WHERE numsujet=2;

ERREUR:  la colonne « new » de la relation « allsujet » n'existe pas
LIGNE 3 : NEW.datemodif = current_date,
          ^
REQUÊTE : UPDATE ALLSUJET SET 
titre = NEW.titre ,
NEW.datemodif = current_date,
NEW.auteurmodif = current_user,
numbackup = numbackup+1,
texte = NEW.texte
WHERE NUMSUJET = NEW.NUMSUJET
CONTEXTE : PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL

en tout cas merci à vous deux d'essayer de m'aider

Dernière modification par Morby (25/01/2012 23:26:26)

Hors ligne

#16 26/01/2012 00:32:15

rjuju
Administrateur

Re : un dernier trigger pour la route

Je voulais dire qu'il ne faut pas faire une requête update mais mettre à jour les champs directement dans le code avec la syntaxe NEW.champ := valeur; comme si c'était une simple variable.

Hors ligne

#17 26/01/2012 00:35:16

Morby
Membre

Re : un dernier trigger pour la route

je n'ai jamais fait ça.... yikes

comment je procède pour récupérer les valeurs à entrer dans les NEW ?
pcq à part NEW.truc = OLD.truc je vois pas, et c'est déjà ce que j'ai précédemment fait

Hors ligne

#18 26/01/2012 00:41:33

rjuju
Administrateur

Re : un dernier trigger pour la route

il faut remplacer

    UPDATE ALLSUJET SET 
        titre = NEW.titre ,
        datemodif = current_date,
        auteurmodif = current_user,
        numbackup = numbackup+1,
        texte = NEW.texte
        WHERE NUMSUJET = NEW.NUMSUJET;

par des instructions

NEW.datmodif := current_date;
NEW.automodif := current_user;
.....

et ce uniquement pour les champs n'étant pas mis à jour par la requête originale (un NEW.titre = OLD.titre est donc inutile).

Hors ligne

#19 26/01/2012 01:14:41

Morby
Membre

Re : un dernier trigger pour la route

rien a faire, le trigger ne veut pas s'enregistrer avec la syntaxe ":="
postgres ne semble accepter que les "=" sans les ":"

d'autre part la requete se met toujours en erreur :

CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;

BEGIN
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifie si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- archivage du sujet modifié
	INSERT INTO LGPBAK 
		(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
		SELECT OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
		OLD.AUTEURMODIF, OLD.TEXTE
		FROM ALLSUJET
		WHERE NUMSUJET=NEW.NUMSUJET;
	-- test sur le nombre de sauvegarde du sujet
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
			DELETE FROM lgpbak WHERE numbackup=(SELECT MIN(numbackup) 
			FROM lgpbak where numsujet = old.numsujet) 
			AND old.numsujet=new.numsujet;
		END IF;
	-- update du sujet 
	-- avec date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		titre = NEW.titre ,
		NEW.datemodif = current_date;
		NEW.auteurmodif = current_user;
		OLD.numbackup = numbackup+1,
		texte = NEW.texte
		WHERE NUMSUJET = NEW.NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

voila l'erreur

UPDATE ALLSUJET SET titre = 'test UPDATE' WHERE numsujet=2;
ERREUR:  la colonne « new » de la relation « allsujet » n'existe pas
LIGNE 3 : NEW.datemodif = current_date
          ^
REQUÊTE : UPDATE ALLSUJET SET 
titre = NEW.titre ,
NEW.datemodif = current_date
CONTEXTE : PL/pgSQL function "fonction_autobackup" line 36 at instruction SQL

il semble qu'il ne veuille pas du NEW non plus sad

Hors ligne

#20 26/01/2012 09:41:45

gleu
Administrateur

Re : un dernier trigger pour la route

rien a faire, le trigger ne veut pas s'enregistrer avec la syntaxe ":="
postgres ne semble accepter que les "=" sans les ":"

Merci de fournir un exemple. Parce que, très clairement, j'ai toujours les ":=" sans aucun problème. Exactement de la même façon que ce que rjuju montre plus haut.

il semble qu'il ne veuille pas du NEW non plus sad

Vous ne pouvez pas mettre le NEW dans le côté gauche de l'opérateur "=". Faites exactement ce que rjuju vous conseille juste au-dessus.


Guillaume.

Hors ligne

#21 26/01/2012 10:32:17

Morby
Membre

Re : un dernier trigger pour la route

voila la version d'hier soir

CREATE OR REPLACE FUNCTION fonction_autobackup() RETURNS TRIGGER AS $$
DECLARE
ok1 boolean;
ok2 boolean;
protec integer;
nbrbackup integer;

BEGIN
-- verifie si le current_user est l'auteur de ce sujet
SELECT (current_user = auteur) INTO ok1 FROM  ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
-- verifie si le current_user est autorisé à modifier ce sujet
SELECT (current_user = autorisedtomodif) INTO ok2 FROM AUTORIS WHERE NUMSUJET = NEW.NUMSUJET;
--- vérifie si la PROTECTION est désactivée (valeur à 0)
SELECT protection into protec FROM ALLSUJET WHERE NUMSUJET = NEW.NUMSUJET;
IF protec=0 THEN ok1="true";
END IF;

IF ok1 or ok2 THEN
	-- archivage du sujet modifié
	INSERT INTO LGPBAK 
		(NUMBACKUP,NUMSUJET,AUTEUR,TITRE,DATEMODIF,AUTEURMODIF,TEXTE)
		SELECT OLD.NUMBACKUP, OLD.NUMSUJET, OLD.AUTEUR,OLD.TITRE, OLD.DATEMODIF, 
		OLD.AUTEURMODIF, OLD.TEXTE
		FROM ALLSUJET
		WHERE NUMSUJET=NEW.NUMSUJET;
	-- test sur le nombre de sauvegarde du sujet
	-- si >10 on supprime le 11ème pour n'en garder que 10
	SELECT COUNT(numbackup) INTO nbrbackup from lgpbak WHERE old.numsujet=new.numsujet GROUP BY numsujet;
		IF nbrbackup>10 THEN
			DELETE FROM lgpbak WHERE numbackup=(SELECT MIN(numbackup) 
			FROM lgpbak where numsujet = old.numsujet) 
			AND old.numsujet=new.numsujet;
		END IF;
	-- update du sujet 
	-- avec date de modif + update de AUTEURMODIF + incrémentation du compteur NUMBACKUP
	UPDATE ALLSUJET SET 
		titre = NEW.titre ,
		NEW.datemodif = current_date;
		NEW.auteurmodif = current_user;
		OLD.numbackup = numbackup+1,
		texte = NEW.texte
		WHERE NUMSUJET = NEW.NUMSUJET;
		RETURN NEW;

	ELSE
	RAISE WARNING 'L''utilisateur % n''est pas autorise à modifier le sujet numero %', current_user, NEW.numsujet;
	RETURN NULL;
	END IF;
END;
$$ LANGUAGE plpgsql;

Gleu > en lisant ton dernier message  je me dis que je n'ai apparemment pas bien compris ce qu'il fallait faire... sauf que je ne sais pas quoi faire d'autre que ce que j'ai déjà fait sad

Hors ligne

#22 26/01/2012 10:55:59

flo
Membre

Re : un dernier trigger pour la route

Relisez le dernier message de rjuju.

Hors ligne

#23 26/01/2012 11:00:19

Morby
Membre

Re : un dernier trigger pour la route

flo > merci, super intervention

si quelqu'un te dit qu'il n'a pas compris et que tu lui répetes exactement la meme chose, penses-tu réellement que ça le fera avancer de lui redire la meme chose ? ne penses tu pas qu'une reformulation serait plus judicieux ?

Hors ligne

#24 26/01/2012 11:27:41

flo
Membre

Re : un dernier trigger pour la route

Si vous n'avez pas compris, alors ne repose pas la même question. Cherchez... Ou demandez plutôt des exemples, de la doc...
Apparemment vous n'avez pas du tout compris comment on mettait à jour la table à partir du trigger. Je viens de relire la doc de Postgresql, elle est claire (notamment le 1er exemple)
http://docs.postgresql.fr/9.1/plpgsql-trigger.html
Lisez-la et revenez poser des questions sur ce que vous ne comprenez pas, ce sera plus constructif.
Si vous avez eu un cours Oracle, c'est le même principe de mise à jour.

Hors ligne

#25 26/01/2012 11:46:14

Morby
Membre

Re : un dernier trigger pour la route

que de condescendance, facile d'enfoncer les gens quand on sait faire et que les autres ne l'ont jamais fait...

si je repose la meme question c'est justement pcq je n'ai pas compris, c'est d'exemples que j'ai besoin !
je suis allé voir les exemples de la doc (lien ci-dessus) mais je ne comprend tjrs pas comment les données s'insèrent dans la table, ya pas d'update/insert dans une table.

les lignes suivantes :
NEW.datemodif := current_date;
NEW.auteurmodif := current_user;
servent-elles juste à donner des valeurs AVANT de faire la requête update sur ma table ?

Hors ligne

Pied de page des forums