2014-05-09 5 views
0
SET @total_no_of_columns := (select count(*) FROM information_schema.COLUMNS c where c.TABLE_NAME = 'MyTableName' and c.TABLE_SCHEMA = 'TableSchema'); 

SET @iCNT = 1; 

    WHILE @iCNT<= @total_no_of_columns DO 
      SET @col_name := (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'TableSchema' AND TABLE_NAME = 'MyTableName' AND ORDINAL_POSITION = @iCNT); 

       IF [email protected]_name <> [email protected]_name THEN 
        //Query to insert in audit table 
      END IF; 

      SET @iCNT = @iCNT + 1; 
    END WHILE; 

Mais [email protected]_name <> [email protected]_name est faux.
Quelle devrait être la solution?Comment faire pour obtenir ANLD VALUE et NEW VALUE dynamiquement obtenir le nom de la colonne dans MySQL?

+0

Quelle est la question? – gimg1

Répondre

0

Dans le corps de déclenchement, le vieux et de nouveaux mots clés vous permettent d'accéder aux colonnes dans les lignes affectées par un déclencheur

Dans un déclencheur INSERT, ne NEW.col_name peut être utilisé.

Dans un déclencheur UPDATE, vous pouvez utiliser OLD.col_name pour faire référence aux colonnes d'une ligne avant sa mise à jour et NEW.col_name pour faire référence aux colonnes de la ligne après sa mise à jour.

Dans un déclencheur DELETE, seul OLD.col_name peut être utilisé; il n'y a pas de nouvelle ligne.

Mais l'ancien et le nouveau est utilisé sur les colonnes qui sont déjà vous present.But utiliser sur les variables son impossible.still Si vous voulez stocker que les valeurs dans une variable et vous pouvez l'utiliser

+0

Merci Ajay. Il s'agit d'un déclencheur APRES MISE A JOUR – PPP

+0

avez-vous réponse? – Ajay

+0

Aucun ami. Vous pouvez voir la conversation entre moi et Ravinder pour une meilleure compréhension de mon problème. – PPP

0

Vous devez Tamponnez le nom de la colonne actuelle en tant que nom de la colonne précédente une fois qu'elle est lue. À la prochaine itération, comparez-le avec le nom de colonne nouvellement lu.

Changer votre code comme indiqué ci-dessous:

select count(*) INTO @total_no_of_columns 
    FROM information_schema.COLUMNS c 
where c.TABLE_NAME = 'MyTableName' 
    and c.TABLE_SCHEMA = 'TableSchema'; 

SET @iCNT = 1; 
SET @previous_column_name := ''; 

WHILE @iCNT<= @total_no_of_columns DO 
    SELECT COLUMN_NAME INTO @current_column_name 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'TableSchema' 
    AND TABLE_NAME = 'MyTableName' 
    AND ORDINAL_POSITION = @iCNT; 

    IF @previous_column_name <> current_column_name THEN 
    -- Query to insert in audit table 

    -- lastly set current name to previous name 
    @previous_column_name := @current_column_name; 
    END IF; 

    SET @iCNT = @iCNT + 1; 
END WHILE; 
+0

Merci Ravinder. Mais je veux comparer entre la valeur OLD et la valeur NEW. Supposons que dans MyTable il y ait 4 colonnes telles que col1, col2, col3, col4. Je veux insérer dans la table d'audit si la valeur de n'importe quelle colonne a été changée. J'ai besoin de stocker le nom de la colonne aussi. Pouvez-vous m'aider s'il vous plaît? C'est un déclencheur AFTER UPDATE. – PPP

+0

Pouvez-vous afficher la structure de table sur laquelle le déclencheur est défini? –

+0

Nom de la table: MyTable Les colonnes sont: col1: ENTIER: clé primaire col2: VARCHAR (45) COL3: DATETIME COL4: VARCHAR (10) Nom – PPP

Questions connexes