lundi 21 février 2011

Flashback Oracle

Un chef de projet est venu me voir un soir (juste avant de rentrer chez lui) en me disant "tiens, il faudrait que tu lances cet UPDATE sur la base de prod pour mettre à jour les emails de la table CONTACT.

Il resta derrière moi, attendant que je le lance en production (et histoire de me mettre la pression). Et moi, j'ai eu la maladresse de ne pas verifier sa requête et je l'ai lancée en production... 

Ce qui devait arriver arriva : la requête n'était pas bonne du tout, et au lieu de mettre à jour les emails ils furent tous supprimés :o(

"Bon je rentre chez moi" me dit le chef de projet (on sent l'esprit d'équipe).

Deux solutions se presentaient alors à moi : 
- reprendre une base de backup pour recuperer les emails (et pour ca je devais galérer pour contacter l'hébergeur, infogérance oblige...) 
- ou utiliser la fonctionnalité magique d'Oracle, le FLASHBACK !

Grossomodo, cette deuxième solution consiste à afficher la table CONTACT telle qu'elle etait à T-X minutes.

Donc:
- je commence par créer une vue permettant d'accéder à la table telle qu'elle était il y a 1 heure : 
create view hour_ago as (select * from contact as of  TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE));
=>Du coup, lorsque je fais select * from hour_ago where id=246 par exemple, j'affiche les données du contact (ayant pour id 246) telles qu'elles étaient il y a une heure

- je fais l'update de la dernière chance :
update contact set contact.email=(select hour_ago.email from hour_ago where hour_ago.id=contact.id);
=> cet update :
    - a donc pris les emails de la table CONTACT tels qu'ils etaient avant la gaffe (grace à la vue hour_ago, avec son intervalle à "60 minutes")
    - a mis à jour la table CONTACT à partir de ces emails 

C'est maaaaaagique :o)

Aucun commentaire:

Categories