2011-06-22 3 views
4

i ont une table dans l'oracle et je veux étudier les mises à jour sur les lignesOracle: Date de modification automatique sur la mise à jour

id number, 
title varchar2(10), 
modify_date date 

j'ai créé un déclencheur pour alimenter le modify_date:

create or replace 
TRIGGER schema.name_of_trigger 
BEFORE UPDATE ON schema.name_of_table 
FOR EACH ROW 
BEGIN 
    :new.modify_date := sysdate; 
END; 

mais Quand je fais une grande mise à jour à partir d'une autre table, je voudrais que le modify_date soit mis à jour UNIQUEMENT pour les lignes avec une nouvelle valeur, pas toutes les lignes.

update mytable a set title = (select title from mytable2 b where b.id = a.id) 

Est-ce possible? Je pensais que Oracle ne serait pas mettre à jour un champ avec la même valeur

Merci

Répondre

7

Vous pensiez que mal, Oracle fait ce que vous commandez à faire.

Vous pouvez essayer

update mytable a set title = 
     (select title from mytable2 b 
     where b.id  = a.id and 
       b.title != a.title) 

ou modifier le déclencheur pour vérifier spécifiquement pour un autre nom de titre.

create or replace 
TRIGGER schema.name_of_trigger 
BEFORE UPDATE ON schema.name_of_table 
FOR EACH ROW 
BEGIN 
-- Check for modification of title: 
    if :new.title != :old.title then 
     :new.modify_date := sysdate; 
    end if; 
END; 
+0

et comment indiquer au déclencheur de ne pas mettre à jour la date si la valeur est différente? – Fredv

+0

Vous comparez ': new.title' avec': old.title' dans le déclencheur. –

+0

Le '! =' N'attrapera pas les valeurs nulles. –

Questions connexes