Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/12/2011, 09h58   #1
Invité régulier
 
Inscription : mai 2002
Messages : 95
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 95
Points : 7
Points : 7
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 :
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
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 13h04   #2
Membre du Club
 
Inscription : avril 2003
Messages : 76
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 76
Points : 63
Points : 63
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
covao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 21h57   #3
Membre du Club
 
Inscription : avril 2003
Messages : 76
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 76
Points : 63
Points : 63
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 :
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 :
"EXECUTE PROCEDURE GESTIONTRACE('Tiers',ID,?ktdq2ID, ?ktdq1ID);"
Les valeurs ?ktdq2 et ?ktdq1 m'intriguent en fait.
covao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 11h37   #4
Invité régulier
 
Inscription : mai 2002
Messages : 95
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 95
Points : 7
Points : 7
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
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h41.


 
 
 
 
Partenaires

Hébergement Web