2014-09-01 1 views
2

J'ai un champ de type "timestamp", appelé "inserted_when". Comment puis-je mettre à jour ce champ (insérer un horodatage) après insertion (de sorte qu'il ne s'applique qu'à l'enregistrement inséré sélectionné)? Au moyen d'un déclencheur bien sûr ... modifier:Firebird après le déclencheur d'insertion - insérer un horodatage sur la ligne insérée

J'ai essayé ceci mais ne peux pas sembler faire la partie non décomposée au travail.

SET TERM^; 
CREATE TRIGGER AFTER_INSERT FOR MYTABLE 
ACTIVE AFTER INSERT POSITION 1 
AS 
BEGIN 
     UPDATE MYTABLE 
     SET MYTABLE.inserted_when = current_timestamp; 

    ---- where mytable.ID = Inserted.ID 
END^ 

SET TERM ;^

Répondre

4

Pour mettre à jour l'enregistrement en cours d'insertion, vous devez utiliser un déclencheur BEFORE UPDATE et non un déclencheur AFTER UPDATE. Les valeurs de la ligne à insérer sont accessibles (et mises à jour) via la variable de contexte NEW (il existe également une variable de contexte OLD, mais cela n'est pas pertinent dans un déclencheur d'insertion). Notez que Firebird déclenche le feu par rangée.

Vous devez changer votre déclencheur:

CREATE TRIGGER BEFORE_INSERT_MYTABLE FOR MYTABLE 
ACTIVE BEFORE INSERT 
AS 
BEGIN 
     NEW.inserted_when = current_timestamp; 
END 

Notez que la variable de contexte OLD est jamais modifiable, et la variable de contexte ne NEW est modifiable dans un déclencheur BEFORE.

2

Vous ne pouvez mettre à jour les champs qui doivent être mis à jour dans un déclencheur BEFORE UPDATE.

Dans la gâchette, vous pouvez faire:

new.inserted_when = current_timestamp; 

Le déclencheur est appelé pour chaque enregistrement mis à jour.

Si vous faites UPDATE MYTABLE dans AFTER UPDATE, vous pouvez vous retrouver dans une boucle infinie.

1

ou tout simplement avoir une valeur par défaut de la colonne inserted_when de CURRENT_TIMESTAMP

pas de déclenchement nécessaire puis

+0

très bon - ne savait pas une telle chose pourrait être fait. – user3927897

Questions connexes