Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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
Julien.
https://rjuju.github.io/
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
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.
Julien.
https://rjuju.github.io/
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
Julien.
https://rjuju.github.io/
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.
Julien.
https://rjuju.github.io/
Hors ligne
#17 26/01/2012 00:35:16
- Morby
- Membre
Re : un dernier trigger pour la route
je n'ai jamais fait ça....
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).
Julien.
https://rjuju.github.io/
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
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
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