2017-06-22 1 views
0

Je veux créer un déclencheur sur firebird db:Je veux vous connecter simplement toutes les colonnes du tableau avec des valeurs nouvelles ou anciennes, mais le déclencheur ne peut pas compiler

SET TERM^; 
create trigger log_trigger_error for test 
    before insert or update 
as 
begin 
    INSERT INTO test_log (a,b) 
    select case when (new.rdb$field_name is null and old.rdb$field_name is not null 
        or new.rdb$field_name is not null and old.rdb$field_name is null 
        or new.rdb$field_name <> old.rdb$field_name) 
       then new.rdb$field_name 
       else old.rdb$field_name as a 
     end , 2 as b 
    from rdb$relation_fields 
    where rdb$relation_name ='TEST'; 

end^ 

SET TERM ;^
+0

Pourriez-vous décrire ce que ce déclencheur est censé faire? –

Répondre

2

Vous créez un déclencheur pour la table test mais dans le corps du déclencheur, vous utilisez les variables de contexte new et old sur une sélection de la table rdb$relation_fields. Ce n'est pas possible, les variables new et old ne sont disponibles que pour la table pour laquelle le déclencheur est utilisé.

Si vous souhaitez enregistrer des modifications aux données puis utiliser comme déclencheur

create trigger log_trigger_error for test before update 
as 
begin 
    INSERT INTO test_log (a, b) VALUES(old.a, old.b); 
end^ 

Maintenant, quand enregistrement de la table test est mis à jour les anciennes valeurs sont enregistrées dans la table test_log.

+1

Il semble que le code de la question ait été copié et modifié à partir du code que le champ consigné renomme. Peut-être 'values ​​(cas où old.a est distinct de new.a alors old.aune fin nulle, cas où old.b est distinct de new.b, alors old.b else null end) et un if pour n'insérer que quand l'un ou l'autre ou les deux sont distincts, ce qui peut sembler vouloir accomplir. –