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

SQL Firebird Discussion :

Boucle pour tester le contenu des colonnes d'une table


Sujet :

SQL Firebird

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut Boucle pour tester le contenu des colonnes d'une table
    Bonjour,

    J'ai créé un trigger sur une table pour alimenter une autre table
    afin de conserver toute modification de colonnes.

    Ainsi, je pourrai savoir qui a modifié quoi et quand.

    Dans mon trigger je place autant de ligne qu'il y a de colonne dans ma table.
    Exemple : si j'ai trois colonnes (NOM, ADRESSE, VILLE) à tester je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     if (OLD.NOM is distinct from NEW.NOM) then
        insert into trace_table (LA_DATE, L_HEURE, LE_USER, NOM_DU_CHAMP, ANCIENNE_VALEUR,  NOUVELLE_VALEUR) 
              values (CURRENT_DATE, CURRENT_TIME, CURRENT_USER, 'NOM', OLD.NOM, NEW.NOM);
     
     if (OLD.ADRESSE is distinct from NEW.ADRESSE) then
        insert into trace_table (LA_DATE, L_HEURE, LE_USER, NOM_DU_CHAMP, ANCIENNE_VALEUR,  NOUVELLE_VALEUR) 
              values (CURRENT_DATE, CURRENT_TIME, CURRENT_USER, 'ADRESSE', OLD.ADRESSE, NEW.ADRESSE);
     
     if (OLD.VILLE is distinct from NEW.VILLE) then
        insert into trace_table (LA_DATE, L_HEURE, LE_USER, NOM_DU_CHAMP, ANCIENNE_VALEUR,  NOUVELLE_VALEUR) 
              values (CURRENT_DATE, CURRENT_TIME, CURRENT_USER, 'VILLE', OLD.VILLE, NEW.VILLE);

    Sur une table avec 20 champs, cela ferait beaucoup de ligne.

    Y aurait-il une possibilité d'utiliser une boucle ?

    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 75
    Points : 117
    Points
    117
    Par défaut
    Bonjour

    Dans ton code, tu répète les même instructions.

    Serait-il intéressant de faire une procédure stockée avec pour parametres d'entrées, la date, l'heure, le user, nom du champ, ancienne valeur et nouvelle valeur, etc ?

    Dans ton trigger, tu effectue autant d'EXECUTE PROCEDURE Gestion_Trace_Tables(...) que de champs à surveiller.


    Mais en creusant un peu plus, il faut essayer en listant les colonnes de la table et faire un EXECUTE STATEMENT pour chaque colonne. C'est à vérifier.

    Covao

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 75
    Points : 117
    Points
    117
    Par défaut
    Voici le test dans le cas tordu que j'ai imaginé pour répondre à cette demande. Voici le code :

    La procédure GestionTrace est fidèle à l'idée de départ. C'est à dire de l'insertion d'une ligne dans la table trace si la valeur d'une colonne d'une table est modifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      FOR SELECT TRIM(f.RDB$FIELD_NAME)
          FROM RDB$RELATION_FIELDS f
            LEFT JOIN RDB$RELATIONS r ON f.RDB$RELATION_NAME = r.RDB$RELATION_NAME AND r.RDB$VIEW_BLR IS NULL AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0)
          WHERE f.RDB$RELATION_NAME  = 'TIERS'
          ORDER BY f.RDB$FIELD_POSITION
          INTO :NomColonne
      DO
        BEGIN
          StmtStr = 'EXECUTE PROCEDURE GESTIONTRACE(''Tiers'','||NomColonne||',Old.'||NomColonne||', New.'||NomColonne||');';
          EXECUTE STATEMENT StmtStr;  
        END
    Bon ben au débogage, StmtStr retourne la valeur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "EXECUTE PROCEDURE GESTIONTRACE('Tiers',ID,?ktdq2ID, ?ktdq1ID);"
    Les valeurs ?ktdq2 et ?ktdq1 m'intriguent en fait.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Bonjour et merci pour votre réponse
    (Meilleurs voeux pour 2012 avant tout)

    Je vais creuser quand même votre idée

    Merci encore pour votre aide

    Cordialement

Discussions similaires

  1. [WD15] Contenue des colonnes d'une table
    Par thierrybatlle dans le forum WinDev
    Réponses: 1
    Dernier message: 12/02/2010, 15h23
  2. [OC]Aligner le contenu des colonnes d'une table à gauche
    Par Doctor Z dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 08/11/2007, 22h07
  3. [ListView] erreur pour tester le contenu des colonnes
    Par Sergio29 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/07/2007, 11h57
  4. [JDBC]Nom des colonnes d'une table
    Par Guybrush dans le forum JDBC
    Réponses: 6
    Dernier message: 08/09/2004, 18h28
  5. [Firebird 1.5] nom des colonnes d'une table
    Par c0rwyn dans le forum SQL
    Réponses: 4
    Dernier message: 03/09/2004, 14h44

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