07 février 2009

Ajouter une contrainte sur les modifications d'une table

Imaginons que l'on possède une base de donnée avec une table de profil utilisateur contenant un champs facultatif (par e.x. : le numéros de téléphone ). Supposons maintenant que l'on désire rendre ce champs obligatoire.

On désirais implémenter un mécanisme s'assurant que ce champs sera complété. D'une part on va modifier l'application pour que l'utilisateur soit obligé de mettre à jour ses données. Et d'autre part on désirais ajouter une contrainte sur la base de donnée pour synthétiser le fait que le profil de l'utilisateur ne peut plus évoluer sans compléter ce champs.

Si l'on refuse de modifier tout les profils pour compléter ce champs devenu maintenant obligatoire avec une valeur bidon, on se retrouve dans l'impossibilité de mettre en œuvre une contrainte oracle classique de type CHECK.

La solution que je vous présente consiste à implémenter un
TRIGGER sur la table déclenché alors qu'une mise à jour des enregistrement intervient. Ce TRIGGER aura pour but de n'autoriser des mise à jour sur les profils que si le champs devenu obligatoire soit remplis.

Voici comment faire :

CREATE
TRIGGER ProfilCheckPhoneNumber AFTER INSERT OR UPDATE ON PROFIL
FOR EACH ROW
BEGIN

IF (:new.phone_number is null) THEN

RAISE_APPLICATION_ERROR(-20000, 'phone_number should be updated first');
END IF;
END;

Ce TRIGGER
déclenchera une exception empêchant la mise à jour d'être effectuées.

Aucun commentaire: