Affichage des articles dont le libellé est sql. Afficher tous les articles
Affichage des articles dont le libellé est sql. Afficher tous les articles

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.

Copier les synonymes d'un schéma de base de donnée oracle

Je vous propose une petite requete SQL permettant d'obtenir une liste de requete sql à executer pour copier les synnonymes d'un schéma :

select 'CREATE SYNONYM "TOUSER".' || synonym_name || ' FOR "' || table_owner || '"."' || table_name || '";' sql_exec from user_synonyms;

et en bonus une requete sql permettant d'obtenir une liste de requete attributant les droit de sélection :

select 'GRANT SELECT ON "' || table_owner || '"."' || table_name || '" TO "TOUSER";' sql_exec from user_synonyms;

TOUSER est l'utilisateur bénéficiaire.

15 mai 2008

Effectuer une requete sql de recherche sans accents avec Oracle

Voici la requête magique :

SELECT street FROM streets WHERE TRANSLATE(street, 'éèàâêîôûäëïöü', 'eeaaeiouaeiou') LIKE TRANSLATE(?, 'éèàâêîôûäëïöü', 'eeaaeiouaeiou')
Cette requête remplace tout les caractéres accentué des valeurs de la base de donnée et de la chaîne passée en paramètre.


Et voici une version qui compare sans tenir compte des majuscules :
SELECT street FROM streets WHERE UPPER(TRANSLATE(street, 'éèàâêîôûäëïöü', 'eeaaeiouaeiou')) LIKE UPPER(TRANSLATE(?, 'éèàâêîôûäëïöü', 'eeaaeiouaeiou'))