Bonjour à vous 2,
Merci de vos réponses qui m'éclairent d'un jour nouveau sur SQL Server mais ce jour n'est pas une lumière pour moi car je trouve cette organisation d'un complexe dans son application et surtout dans son évolution.
En effet, l'idée que j'avais croisée chez Oracle, et à laquelle j'avais pas mal adhéré, c'est de pouvoir à ce champ défini dans la table directement
DECLARE v_empId employe.empid%TYPE;
Dès que je change le champ empid de la table employe, c'est automatiquement impacté dans toute la base de données sans autre intervention que celle de modification du champ dans la base de données.
Maintenant, avec SQL Server, vous me dites qu'il faut définir ses types utilisateurs mais que, comme le dit ci bien hmira
Attention :
- Créer et utiliser un type défini par l'utilisateur est quelque chose de très simple et facile..
- Modifier un type utilisateur déjà référencée est une autres histoire, qui souvent s'avère laborieuse (mais toujours faisable). L'instruction ALTER TYPE n'existe pas !
Ce qui fait qu'aujourd'hui, je défini un type
CREATE TYPE dbo.DA_LIBELLE FROM VARCHAR(64);
Dans la création de ma table j'ai donc
PRD_DESIGNATION dbo.DA_LIBELLE NOT NULL
Et dans mes fonctions et procédure stockées j'utilise la déclaration
DECLARE @Libelle AS dbo.DA_LIBELLE
Jusque là tout va bien, ma base vie bien jusqu'au jour où on me demande d'augmenter la taille de ce champ (ça a beau être prévu à la base, ça arrivent toujours ces choses là, en cours de projet comme en projet terminé depuis plusieurs années).
Bref, je ne peux pas faire de pour le redéfinir.
2 options s'offrent à moi :
[LIST=1][*]Supprimer la définition et la refaire,[*]Ajouter une nouvelle définition et l'utiliser dans la table...
La première solution n'est pas possible car elle est utilisée par la table... et les fonctions et les procédures...... Un message d'erreur s'affiche quand je tente de le faire
Cannot drop type 'DA_LIBELLE' because it is being referenced by object 'T_PRODUIT_PRD'. There may be other objects that reference this type.
OK donc je supprime la table pour pouvoir supprimer le type et refaire tout ça avec ma nouvelle définition... Ah oui mais j'ai des liens... que je peux désactiver... OK Oui mais surtout j'ai des données maintenant que la base est en production !!! Que je peux copier dans une autre table, sans utiliser le type à supprimer... Arriver là, il reste les fonctions et les procédures qui empêchent de supprimer le type. Donc les supprimer pour enfin supprimer le type.
Ceci fait, il faut tout refaire dans l'autre sens en changeant le TYPE.
Je passe bien sûr allègrement sur la notion de "factorisation", tel que l'évoque hmira, qui, dans ce cas, impactera plusieurs tables donc d'autant plus de travail à réaliser, sans pour autant être pertinent de réaliser cette impact sur toutes les tables
En gros j'ai l'impression que je refais tout le boulot pour la modification d'un champ.
Long, fastidieux, risqué car beaucoup de manipulation DONT des données...
Je regarde donc la seconde solution...
OK je crée un nouveau type
CREATE TYPE dbo.DA_LIBELLE2 FROM VARCHAR(100);
Du coup je peux adapter ma table
ALTER TABLE MaTable ALTER COLUMN PRD_DESIGNATION dbo.DA_LIBELLE2 NOT NULL
OK mais toutes mes fonctions et procédures sont à refaire avec le nouveau type, j'y gagne rien en terme de recherche et d'intervention sur toutes les fonctions et procédures qui l'utilise.
Certes, c'est moins de travail que la première solution et c'est moins risqué car il n'y a pas de manipulations de données.
En fait non, pour tout avouer, je pense gagner quand même quelque chose d'essentiel, c'est l'assurance que ma base de données sera homogène dans son intégralité (et c'est déjà bien) mais je crains que cette assurance ne soit pas comprise par le client lorsqu'il faudra lui annoncer la quantité de travail à réaliser "juste" pour allonger son champ (ça m'est déjà arrivé sans avoir utilisé les types justement)...
Néanmoins, je rappelle quand même le but de la question initiale, avoir une maintenance évolutive simple et je n'ai franchement pas l'impression d'y être comme avec Oracle...
Alors qu'à la manière d'Oracle, franchement c'était beaucoup plus simple. C'est dommage car ces derniers temps je me disais que SQL Server était plus simple qu'Oracle mais là je dois avouer qu'il y aurait bien une amélioration.
A moins qu'il n'y ai d'autres aspects que je n'aurais pas vu ou compris, je trouve cette mise en œuvre complexe pour une réponse toute simple telle que l'a faite Oracle.
SQLpro, hmira, je ne vous jette pas la pierre quand à votre réponse tout à fait adaptée à ce que je craignais avoir entrevu sur le internet, à savoir l'utilisation des types et je sais que c'est un vœux pieux que de voir cette évolution arriver un jour sur SQL Server tant le poids de l'héritage est présent pour la compatibilité descendante des systèmes.
Merci en tout cas à vous pour vos promptes réponses.
Partager