IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Archiver avant d'effacer


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Par défaut Archiver avant d'effacer
    Bonjour ,

    je dois faire un trigger qui archive de 2 tables différentes avant d'effacer , j'ai donc crée une table pour archiver , mais lorsque que je lance la fonction que j'ai crée pour effacer cela me renvoie une erreur (ma fonction pour effacer fonctionne sans le trigger )

    "ERREUR: l'enregistrement « old » n'a pas de champs « numstage »
    CONTEXT: instruction SQL « insert into archive values (default,old.nometudiant,old.prenometudiant,old.numstage,old.titrestage,old.objetstage,old.anneescolaire,old.numetudiant,old.regimeetudiant,old.numcontact,old.numprofsuiveur,old.remarques) »
    fonction PL/pgsql archivage(), ligne 6 à instruction SQL
    instruction SQL « delete from etudiants where numetudiant = numero »
    fonction PL/pgsql effacetudiant(character varying), ligne 14 à instruction SQL"

    voici ma fonction pour effacer ainsi que mon trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    create or replace function effacetudiant(nometud varchar)
    returns void as
    $$
    declare numero int;
     
    begin 
    perform nometudiant from etudiants where nometudiant=nometud;
    if not found then
    raise exception 'l''etudiant % n''existe pas',$1;
    else
    select numetudiant into numero from etudiants
    	where nometudiant = nometud; 
    delete from periodes where numstage in 
    (select numstage from stages where numetudiant = numero);
     	delete from stages where numetudiant= numero;
    	delete from etudiants where numetudiant = numero;
     
    raise notice 'l''etudiant % a été effacé',$1;
     
    return  ;
    end if;
    end;
    $$
    language plpgsql;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace function archivage1() returns trigger as
    $$
     
     
    begin
     
    insert into archive values (default,old.nometudiant,old.prenometudiant,old.numstage,old.titrestage,old.objetstage,old.anneescolaire,old.numetudiant,old.regimeetudiant,old.numcontact,old.numprofsuiveur,old.remarques);
    return old;
    end;
    $$
    language plpgsql;

    si quelqu'un avait une petite idée

    merci d'avance

  2. #2
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Dans le cas de INSERT, OLD est vide!
    Dans le case de DELETE, NEW est vide!
    Par ailleurs, les lignes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    perform nometudiant FROM etudiants WHERE nometudiant=nometud;
    IF NOT found then
    raise exception 'l''etudiant % n''existe pas',$1;
    else
    SELECT numetudiant INTO numero FROM etudiants
    	WHERE nometudiant = nometud;
    peuvent être contracter en...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT numetudiant INTO numero FROM etudiants
    	WHERE nometudiant = nometud;
    IF NOT found then
    raise exception 'l''etudiant % n''existe pas',$1;
    else
    ...
    @+

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Par défaut
    Bonjour et merci de ta réponse.

    Mais alors, comment faire pour que le trigger insère dans old les valeurs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    create or replace function archivage() returns trigger as
    $$
    declare
    nometud varchar;
    prenometud varchar;
    numsta integer;
    titresta varchar;
    objetsta varchar;
    anneescol date;
    numetud integer;
    regimeetud varchar;
    numconta integer;
    numprofsuiv integer;
    remarque varchar;
     
    begin
     
    nometud:=old.nometudiant;   
    select nometudiant into nometud from etudiants where nometudiant=nometud;
    prenometud:=old.prenometudiant;
    select prenometudiant into prenometud from etudiants where prenometudiant=prenometud;
    numsta:=old.numstage;
    select numstage into numsta from stages where numstage=numsta;
    titresta:=old.titrestage;
    select titrestage into titresta from stages where numstage=numsta;
    objetsta:=old.objetstage;
    select objetstage into objetsta from stages where numstage=numsta;
    anneescol:=old.anneescolaire;
    select anneescolaire into anneescol from stages where numstage=numsta;
    numetud:=old.numetudiant;
    select numetudiant into numetud from stages where numstage=numsta;
    regimeetud:=old.regimeetudiant;
    select regimeetudiant into regimeetud from stages where numstage=numsta;
    numconta:=old.numcontact; 
    select numcontact into numconta from stages where numstage=numsta;
    numprofsuiv:=old.numprofsuiveur;
    select numprofsuiveur into numprofsuiv from stages where numstage=numsta;
    remarque:=old.remarques;
    select remarques into remarque from stages where numstage=numsta;
    insert into archive values (default,nometud,prenometud,numsta,titresta,objetsta,anneescol,numetud,regimeetud,numconta,numprofsuiv,remarque);
    return old;
     
    end;
    $$
    language plpgsql;
    Car avec cette requête, même en lui spécifiant les old, il n’insère pas et me renvoie la même erreur.

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    Salut,

    Tu n'es pas obligée de faire ça dans un trigger...

    Tu peux utiliser returning (qui existe pour update, delete, insert), la syntaxe est détaillée dans la doc postgresql...

    En gros, ça te permet d'enchainer une action qui reprend tout ou partie de ce qui as été fait dans une action d'écriture (update, delete, insert) pour un affichage (select) ou une autre action d'écriture sur une autre table...

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Par défaut
    merci pour ta réponse je regarde ça tout de suite

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    Ça permet de tout faire en une requête...

    Les triggers vaut mieux qu'ils soient courts vu qu'ils s'exécutent à chaque ligne et s'en passer quand on peut

Discussions similaires

  1. [XL-2003] Copier avant d'effacer
    Par sylvestre09 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/04/2012, 16h14
  2. Effacer une ligne pour archiver
    Par laurent.c123 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2007, 12h01
  3. script pour demander une confirmation avant d effacer
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2006, 10h46
  4. Effacer un Canvas avant de redessiner dessus
    Par Kwentin dans le forum Java ME
    Réponses: 3
    Dernier message: 09/10/2006, 08h21
  5. [VBA-E]Copier avant d'effacer
    Par tarmin dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/01/2006, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo