2010-10-07 4 views
0

J'ai deux tables dans ma base de données. Cela peut augmenter ultérieurement. Je souhaite ajouter une autre table Audit pour suivre les modifications apportées aux deux tables existantes. Je veux suivre tout changement fait à l'un de ces tableau structure table de vérification est
ID
Table_Name
Field_Name
old_value
new_value
MODIFIED_BY
Date_of_Modification
Comment créer un déclencheur pour enregistrer les modifications pour Insérer, Mettre à jour, Supprimer pour plusieurs tables

SO maintenant je veux avoir un déclencheur pour les deux tables qui peuvent être déclenchées sur un insert, mettre à jour ou supprimer à l'une de mes tables. Lorsque ce déclencheur est déclenché, je veux insérer des valeurs dans Audit. Lorsque je mets à jour, je veux l'ancienne valeur et la nouvelle valeur.Lors de l'insertion, je veux ancienne valeur comme rien et nouvelle valeur comme inséré.Lors de la suppression, je veux ancienne valeur comme ancienne valeur existante et nouvelle valeur supprimée.

Répondre

1

Je ne sais pas exactement quelle est votre question. Les déclencheurs peuvent utiliser le: vieux et: de nouveaux mots clés comme celui-ci:

create trigger table1_trg 
after insert or update or delete on table1 
for each row 
begin 
    if :old.col1 is null and :new.col1 is not null 
    or :old.col1 is not null and :new.col1 is null 
    or :old.col1 != :new.col1 
    then 
     insert into audit_table ... 
    end if; 

    -- Ditto for col2, col3, ... 
end; 

Il n'y a aucun moyen générique pour ce faire, vous devez avoir un code pour chaque colonne. Cependant, vous pouvez encapsuler la logique comme ceci:

procedure log_col_change 
    (p_table_name varchar2 
    , p_column_name varchar2 
    , p_old_val varchar2 
    , p_new_val varchar2 
    ) 
is 
begin 
    if p_old_val is null and p_new_val is not null 
    or p_old_val is not null and p_new_val is null 
    or p_old_val != p_new_val 
    then 
     insert into audit_table ... 
    end if; 
end; 

-- Overloaded version to handles DATE columns without losing time component 
procedure log_col_change 
    (p_table_name varchar2 
    , p_column_name varchar2 
    , p_old_val date 
    , p_new_val date 
    ) 
is 
begin 
    log_col_change (p_table_name, p_column_name 
        , to_char(p_old_val,'YYYY-MM-DD HH24:MI:SS') 
        , to_char(p_new_val,'YYYY-MM-DD HH24:MI:SS') 
       ); 
end; 

Le déclencheur est alors:

create trigger table1_trg 
after insert or update or delete on table1 
for each row 
begin 
    log_col_change ('MYTABLE', 'COL1', :old.col1, :new.col1); 
    log_col_change ('MYTABLE', 'COL2', :old.col2, :new.col2); 
    ... etc. 
end; 

NB meilleure pratique serait de mettre les procédures en un paquet.

+0

Va essayer cette approche et revenir.Merci – gizgok

+0

Attendez - soyez prudent avec les colonnes DATE: Je vais mettre à jour ma réponse ... –

Questions connexes