1. #81
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut CREATE DOMAIN vs CREATE TYPE

    Bonjour,
    Quelqu'un peut m'expliquer pourquoi MS SQL SERVER ne permet la création de domaine à l'aide de la commande CREATE DOMAIN ?
    je rappelle qu'un domaine est un alias de type (natif) sur lequel on peut définir des contraintes (CHECK, NOT NUL, ...). Selon la norme SQL on peut définir un domaine en utilisant la commande CREATE DOMAIN.

    Exemple :
    --------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE DOMAIN D_CONTINENT  AS CHAR(8)
    DEFAULT 'AFRIQUE'
    CONSTRAINT CHK_D_CONTINENT CHECK (VALUE IN ('AFRIQUE','AMERIQUE','ASIE','EUROPE','OCEANIE'))
    => Quels sont les avantages de l'utilisation des domaines dans un SGBD ?

    1. Uniformisation des types de données : on ne verra pas par exemple pour une même base de données une table avec une colonne TELEPHONE avec le type VARCHAR(15) et dans une autre table TELEPHONE avec VARCHAR(20)

    2. Lisibilité des types de données + qualité des données: choix des types appropriés des types prédéfinis + les contraintes

    3. Il paraît que l'utilisation des domaines à la place des types standards permet d'optimiser l'espace RAM.

    => Et les inconvénients ?

    1. ALTER DOMAIN ne permet pas de modifier les types de données (prédéfinis): ALTER DOMAIN ne s'applique que pour les DEFAULT et les CONTRAINTs

    2. Problèmes avec DROP DOMAIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP DOMAIN name [ CASCADE | RESTRICT ]
    et ses prob
    la suppression du domaine devrait en principe préserver les colonnes et leurs appliquer le type standard (built-in) sur le lequel le domaine était définit.
    Par exemple sous PostGreSQL 9.1, j'ai constaté que la suppression de domaine avec l'option RESTRICT renvoie l'erreur suivante :

    ERREUR: n'a pas pu supprimer type d_continent car d'autres objets en dépendent
    État SQL :2BP01
    Détail :table t_cont colonne col dépend de type d_continent
    Astuce : Utilisez DROP ... CASCADE pour supprimer aussi les objets dépendants.
    Et lorsque j'utilise l'option CASCADE, non seulement le domaine est supprimé mais aussi TOUTES LES COLONNES BASÉES SUR CE DOMAIN !

    => Quand est-il de l'indexation des colonnes utilisant des domaines ?

    => Pourquoi MS SQL SERVER au lieu d'implémenter la commande CREATE DOMAIN préfère des bidouilles du genre pour avoir un résultat similaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TYPE toto ....
    CREATE RULE R_toto ...
    EXEC sp_bindrule R_toto ...
    EXEC sp_bindefault ....
    chose curieuse le Book On Line recommande de ne plus utiliser CREATE RULE !

    CREATE RULE will be removed in a future version of Microsoft SQL Server. Avoid using CREATE RULE in new development work, and plan to modify applications that currently use it. We recommend that you use check constraints instead. Check constraints are created by using the CHECK keyword of CREATE TABLE or ALTER TABLE. For more information, see CHECK Constraints.
    Quelqu'un peut m'éclairer ?

    Merci d'avance
    Etienne ZINZINDOHOUE
    Billets-Articles

  2. #82
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    août 2005
    Messages
    4 984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : août 2005
    Messages : 4 984
    Points : 11 475
    Points
    11 475

    Par défaut

    Malheureusement pour le moment pas d'explication sur le sujet .. effectivement on a un gap la dessus et visiblement la version 2012 ne répondra pas à cette problèmatique pour le moment.

    ++

  3. #83
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 257
    Points : 39 959
    Points
    39 959
    Billets dans le blog
    1

    Par défaut

    Il y a quand même un gros avantage a la structuration des RULEs et des DEFAULTs de SQL Server :
    1) les RULEs et les DEFAULTs peuvent être utilisé aussi bien pour des types (donc domain) que pour des colonnes de table
    2) ces objets ont une meilleure durée de vie en cache du fait qu'ils peuvent être mutualisés (par exemple une RULE ou un DEFAULT peut être utilisé par plusieurs TYPE et plus il est utilisé, plus il restera en cache).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  4. #84
    CUCARACHA
    Invité(e)

    Par défaut petite modification pour la génération des scripts

    Bonjour,

    J'utilise souvent la fonctionnalité générer les scripts d'une base de données.
    Parfois pour générer les tables et d'autres fois pour les données.

    Pour choisir l'une ou l'autre des options il faut cliquer sur le bouton [Avancé] de la deuxième étape.

    Comme il reste de la place dans l'écran, j'aimerais qu'on mette les trois options :

    Générer la structure seulement
    Générer les données seulement
    Générer la structure et les données

    Dans trois cases à cocher dans l'écran et non dans la boite de dialogue de paramètres avancés.

    Bien à vous

    Laurent

  5. #85
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juillet 2008
    Messages : 100
    Points : 128
    Points
    128

    Par défaut

    Microsoft à fait évoluer sa solution de HA avec AlwaysOn sur SQL Server 2012, mais encore une fois ça garde un gout d'inachevé.
    Il est encore impossible d'avoir la même base en lecture/écriture sur deux sites distants, avec AlwaysOn on a la lecture possible sur la base secondaire...
    Une solution de HA avec les bases secondaires aussi en lecture écriture ça serait bien cool

  6. #86
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    août 2005
    Messages
    4 984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : août 2005
    Messages : 4 984
    Points : 11 475
    Points
    11 475

    Par défaut

    Citation Envoyé par SiSMik Voir le message
    Microsoft à fait évoluer sa solution de HA avec AlwaysOn sur SQL Server 2012, mais encore une fois ça garde un gout d'inachevé.
    Il est encore impossible d'avoir la même base en lecture/écriture sur deux sites distants, avec AlwaysOn on a la lecture possible sur la base secondaire...
    Une solution de HA avec les bases secondaires aussi en lecture écriture ça serait bien cool
    Inachevé je ne pense pas du moins pas dans le sens ou vous l'entendez. AlwaysOn répond aux problématiques de haute disponibilité et non à un contexte de load balancing. Les besoins ne sont pas les mêmes ici.

    ++

  7. #87
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juillet 2008
    Messages : 100
    Points : 128
    Points
    128

    Par défaut

    Citation Envoyé par mikedavem Voir le message
    Inachevé je ne pense pas du moins pas dans le sens ou vous l'entendez. AlwaysOn répond aux problématiques de haute disponibilité et non à un contexte de load balancing. Les besoins ne sont pas les mêmes ici.

    ++
    C'est pas vraiment du load balancing que j'avais imaginé, mais un environnement multi-site qui permette d'avoir une base synchronisée dans plusieurs endroits instantanément

  8. #88
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    août 2005
    Messages
    4 984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : août 2005
    Messages : 4 984
    Points : 11 475
    Points
    11 475

    Par défaut

    C'est pas vraiment du load balancing que j'avais imaginé, mais un environnement multi-site qui permette d'avoir une base synchronisée dans plusieurs endroits instantanément
    Je dirais que dans ce cas il y a bien d'autres solutions telle que la replication merge ou peer to peer. Honnetement encore une fois je ne pense pas que l'on voit pour le moment ce genre de fonctionnalites avec Always On car celui-ci n'est pas designe pour ce besoin.

    ++

  9. #89
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut Ipv4, IPv6 : Stockage et Opérations

    La norme SQL n'a jusqu'à ce jour rien prévu pour le stockage de type donnée IP. Inutile de rappeler ici l'importance et la place de l'adresse ip dans le monde professionnel et personnel. A-t-on besoin de stocker des adresses IP dans une base de donnée relationnelles ? Voici une réponse
    Et pourtant rien n'est fait côté SQL Server pour mettre à disposition un type capable de stocker une adresse ip et faciliter les opérations sur cette donnée.
    Côté Oracle pareil. Du moins jusqu'à ce jour.

    Prenons un cas pour illustrer le besoin :
    Comment faire simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IP_ADR FROM myTable WHERE IP_ADR > IP_ADR_MIN AND IP_ADR  < IP_ADR_MAX
    Bien sûr, en bidouillant avec la fonction PARSENAME de SQL Server on peut trouver une porte de sortie pour les IP stockés comme des types de caractères... Mais on ne gagne ni en productivité ni lisibilité ni en performance ...!

    Saluons au passage le travail des développeurs du SGDB PostgreSQL sur ce point . PostgreSQL offre des types de données pour stocker IPv4, IPv6 et MAC ADRESSE. Les types CIDR et INET fournis par PostgreSQL permettent de stocker et d'effectuer des opérations ( =, >, <, <>,..) sur les adresses IP (IPv4 et IPv6)

    Qu'est ce que les "grands" éditeurs de SGBD attendent ?
    Etienne ZINZINDOHOUE
    Billets-Articles

  10. #90
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut CHECK CONSTRAINT/ASSERTION : Personnaliser les messages d'erreurs

    => Contexte
    En SQL la liste des types de contraintes que l'on peut poser sur une table est exhaustive : UNIQUE CONSTRAINT, PRIMARY KEY CONSTRAINT, REFERENTIAL CONSTRAINT et CHECK CONSTRAINT. Généralement, les messages d'erreurs renvoyés en cas de problèmes sur les contraintes d'unicité, de clé primaire ou d'intégrité référentielle sont clairs et permettent de rapidement solutionner le problème. Mais pour les contraintes de validation (CHECK) le message d'erreur est générique est est sous la forme :
    L'instruction %1! est en conflit avec la contrainte %2! "%3!". Le conflit s'est produit dans la base de données "%4!", table "%5!"%6!%7!%8!.
    Vous pouvez le vérifier est exécutant la commande ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT text FROM sys.messages
    WHERE message_id = 547 AND language_id = 1036
    Noter que le message_id = 547 est le code d'erreur relatif au constraint CHECK et language_id = 1036 c'est pour avoir la traduction en français

    => Problème
    Comment personnaliser directement les messages d'erreur lors de la définition d'un CONSTRAINT CHECK ou d'une ASSERTION SQL ?
    C'est a dire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE PERIODE (datedebut DATETIME, datefin DATETIME)
    ALTER TABLE PERIODE ADD CONSTRAINT CHK_PERIODE CHECK (datedebut <= datefin) VIOLETED_CONSTRAINT_MESSAGE ('la date de debut doit être antérieure ou égale à la date de fin')
    => Questions/Contournements
    Je ne sais pas si SQL SERVER 2012 permet ce genre de chose. Je n'ai pas encore touché à SQL SERVER 2012 ;-)
    En tout cas sur SQL Server 2008 R2 c'est pas possible !
    Deux rustines sous SQL SERVER 2008R2 pour essayer de se rapprocher de la personnalisation des messages d'erreur pour les CONSTRAINTS CHECKs

    --> 1. TRY/CATCH du code d'erreur 547
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ALTER PROCEDURE P_INSERT (@debut DATETIME,@fin DATETIME)
    AS
    BEGIN TRY
    INSERT INTO PERIODE (datedebut,datefin) VALUES(@debut,@fin)
    END TRY
    BEGIN CATCH
    IF @@ERROR = 547 
    RAISERROR ('la date de debut doit être antérieure ou égale à la date de fin',16,1)
    END CATCH 
     
    EXEC P_INSERT '20120619','20120618'
    /*
    la date de debut doit être antérieure ou égale à la date de fin
    */
    --> 2. TRIGGER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ALTER TRIGGER INSTEADOF_TR_PERIODE ON PERIODE 
    INSTEAD OF INSERT AS 
    BEGIN
    DECLARE @debut DATETIME,@fin DATETIME
    SELECT @debut = I.datedebut, @fin = I.datefin FROM INSERTED I
    IF (@debut > @fin ) RAISERROR ('la date de debut doit être antérieure ou égale à la date de fin',16,1)
    RETURN
    END
    INSERT INTO PERIODE (datedebut,datefin) VALUES('20120619','20120618')
    /*
    la date de debut doit être antérieure ou égale à la date de fin
    */
    Etienne ZINZINDOHOUE
    Billets-Articles

  11. #91
    Membre éprouvé

    Profil pro
    Inscrit en
    juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 448
    Points : 1 199
    Points
    1 199

    Par défaut

    Ce serait plutôt au niveau applicatif/interface que tu devrais donner un meilleur sens lexical à ces erreurs.
    Most Valued Pas mvp

  12. #92
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    5 975
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 5 975
    Points : 18 830
    Points
    18 830
    Billets dans le blog
    15

    Par défaut

    Bonjour,


    Citation Envoyé par zinzineti Voir le message
    pour les contraintes de validation (CHECK) le message d'erreur est générique
    Je ne suis pas un expert ès MS SQL Server et quelque chose m’échappe. Si je crée une table — appelons-la par exemple CLASSIFICATION — avec une contraite CHECK :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE CLASSIFICATION
    (
            ClassifId               INT              NOT NULL
          , ClassifNom              VARCHAR(64)      NOT NULL
        , CONSTRAINT CLASSIFICATION_PK PRIMARY KEY (ClassifId)
        , CONSTRAINT CLASSIFICATION_CHCK01 CHECK (ClassifId > 0)) ;
    Et si je tente d’enfreindre la contrainte :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO CLASSIFICATION (ClassifId, ClassifNom) VALUES (-1, 'Pommier microcarpe de Sibérie') ;

    Alors j’ai droit au message :

    Msg 547, Level 16, State 0, Line 78
    L'instruction INSERT est en conflit avec la contrainte CHECK "CLASSIFICATION_CHCK01". Le conflit s'est produit dans la base de données "MaBdd", table "dbo.CLASSIFICATION", column 'ClassifId'.
    L'instruction a été arrêtée.
    Et j’avoue que cela me suffit pour repérer mon erreur et corriger, puisque le SGBD me transmet le nom de la table et celui de la contrainte, comme dans le cas des infractions relatives aux clé primaires, alternatives et étrangères.

    N.B. J’utilise MS SQL Server 2005 en français (Microsoft SQL Server Management Studio Express 9.00.2047.00).
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  13. #93
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut

    Citation Envoyé par fsmrel Voir le message
    Je ne suis pas un expert ès MS SQL Server et quelque chose m’échappe
    Bonjour François,
    Tes interventions sur ce forum sont à 99.9999 % de très bonne qualité. Qualité sur le fond et aussi sur la forme et je voudrais ici te remercier pour le temps que tu consacres à partager tes connaissances et à nous éclairer sur la modélisation et l'implémentation des bases de données relationnelles.
    Pour revenir à mon post, je précise que l'objectif c'est la possibilité de personnaliser les messages d'erreurs pour les contraintes CHECK en cas de violation. Je reconnais que le message renvoyé par MS SQL en cas de violation de contrainte est suffisant pour corriger les problèmes pour une personne ayant une petite expérience en SQL mais pas pour quelqu'un qui est plus orienté métier/fonctionnel. Ce qui me gène c'est l'impossibilité d'ajouter une information métier/fonctionnelle/complémentaire en cas de violation de contrainte. Pour une application client-Serveur, on peut ajouter cette information métier/fonctionnelle/complémentaire côté client.
    As-tu une idée sur comment je peux personnaliser les messages en cas de violation d'une contrainte ? c'est à dire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        CREATE TABLE CLASSIFICATION
    (
        ClassifId               INT              NOT NULL
      , ClassifNom              VARCHAR(64)      NOT NULL
      , CONSTRAINT CLASSIFICATION_PK PRIMARY KEY (ClassifId)
      , CONSTRAINT CLASSIFICATION_CHCK01 CHECK (ClassifId > 0) WITH VIOLATED_MESSAGE 'L''ID de la classification doit être un nombre entier différent de zéro') ;
    Je sais que la norme SQL ne permet pas cette flexibilité dans les contraintes. Mais tes commentaires sont les bienvenus ! :-)
    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  14. #94
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    5 975
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 5 975
    Points : 18 830
    Points
    18 830
    Billets dans le blog
    15

    Par défaut Rêvons...

    Bonjour Etienne,


    Merci pour vos sympathiques commentaires.


    Citation Envoyé par zinzineti Voir le message
    Je sais que la norme SQL ne permet pas cette flexibilité dans les contraintes. Mais tes commentaires sont les bienvenus !
    Ach! J’avoue qu’au début des années soixante-dix, quand j’étais à fond dans IMS d’IBM (surtout dans son composant SGBD hiérarchique), votre extension simplificatrice m’aurait déjà été très utile, de même quand je suis passé à DB2 au milieu des années quatre-vingts... Las ! J’en ai sempiternellement été réduit à tester le code-retour du SGBD avec de la sueur à la clé. Quant à elle, la norme SQL ne dit effectivement rien et s’il faut attendre encore quarante ans, je ne verrai pas ses recommandations ès matière...

    Aujourd’hui, je me résous malheureusement encore à utiliser une technique lourde, imposée par le SGBD (SQLCA de DB2, TRY/CATCH de SQL Server, etc.) Qui plus est, la présence de plus d’une contrainte CHECK alourdit la programmation au niveau des contrôles, tandis que toutes les erreurs peuvent être commises en même temps par l’utilisateur... :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     CREATE TABLE CLASSIFICATION
    (
            ClassifId               INT              NOT NULL
          , ClassifNom              VARCHAR(64)      NOT NULL
        , CONSTRAINT CLASSIFICATION_PK PRIMARY KEY (ClassifId)
        , CONSTRAINT CLASSIFICATION_CHCK01 CHECK (ClassifId > 0)
        , CONSTRAINT CLASSIFICATION_CHCK02 CHECK (LEN(ClassifNom) > 0)
          ...
        , CONSTRAINT CLASSIFICATION_CHCKn CHECK (...)
    ) ;

    Avec toute ces contraintes pour une seule table, que devient par exemple le code d’un TRY/CATCH associé ?

    Je suis désolé d’avoir seulement évoqué mes regrets d’antan sans pouvoir apporter quelque chose de constructif sur ce sujet...

    Il ne reste plus qu’à investir les comités de normalisation et imposer la clause « WITH VIOLATED_MESSAGE », dont la mise en oeuvre ne devrait pas a priori être lourde de conséquences sur les développements chez les éditeurs et nous permettrait en revanche d’éviter de réécrire des pans de code SQL, par exemple lors du portage d’un SGBD à l’autre : rêvons...
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  15. #95
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut

    Citation Envoyé par fsmrel Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     CREATE TABLE CLASSIFICATION
    (
            ClassifId               INT              NOT NULL
          , ClassifNom              VARCHAR(64)      NOT NULL
        , CONSTRAINT CLASSIFICATION_PK PRIMARY KEY (ClassifId)
        , CONSTRAINT CLASSIFICATION_CHCK01 CHECK (ClassifId > 0)
        , CONSTRAINT CLASSIFICATION_CHCK02 CHECK (LEN(ClassifNom) > 0)
    ) ;

    Avec toute ces contraintes pour une seule table, que devient par exemple le code d’un TRY/CATCH associé ? .... la présence de plus d’une contrainte CHECK alourdit la programmation au niveau des contrôles
    Pour le TRY/CATCH, le code 547 ne suffit plus dans le cas d'une table ayant plusieurs contraintes CHECK. Dans ce cas la gestion des erreurs de violation des contraintes CHECK devient plus lourde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    ALTER PROCEDURE P_INSERT_CLASSIFICATION (@ClassifId INT,@ClassifNom  VARCHAR(64))
    AS
    BEGIN TRY
    INSERT INTO CLASSIFICATION (ClassifId,ClassifNom) VALUES(@ClassifId,@ClassifNom)
    END TRY
    BEGIN CATCH
    IF (ERROR_MESSAGE() LIKE '%CHECK %CLASSIFICATION_CHCK01%' ) RAISERROR ('ID de la classification doit être un nombre entier différent de zéro !',16,1) 
    ELSE IF (ERROR_MESSAGE() LIKE '%CHECK %CLASSIFICATION_CHCK02%') RAISERROR ('Le nom de la classification doit être non null !',16,1)
    ELSE RAISERROR ('Echec lors de l''éxécuion de la procedure P_INSERT_CLASSIFICATION !',16,1) 
    END CATCH
     
    EXEC P_INSERT_CLASSIFICATION -1, 'Pommier microcarpe de Sibérie'
    /*
    Msg 50000, Level 16, State 1, Procedure P_INSERT_CLASSIFICATION, Line 7
    ID de la classification doit être un nombre entier différent de zéro
    */
     
    EXEC P_INSERT_CLASSIFICATION 1,''
    /*
    Msg 50000, Level 16, State 1, Procedure P_INSERT_CLASSIFICATION, Line 8
    Le nom de la classification doit être non null !
    */
     
    EXEC P_INSERT_CLASSIFICATION -1,''
    /*
    Msg 50000, Level 16, State 1, Procedure P_INSERT_CLASSIFICATION, Line 7
    ID de la classification doit être un nombre entier différent de zéro
    */
    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  16. #96
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Recherche, formation, développement
    Inscrit en
    août 2006
    Messages
    1 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Mali

    Informations professionnelles :
    Activité : Recherche, formation, développement

    Informations forums :
    Inscription : août 2006
    Messages : 1 463
    Points : 3 151
    Points
    3 151
    Billets dans le blog
    6

    Par défaut

    Salut
    ZINEZINETI: six 9 à fsmrel tandis que les serveurs n'en ont que cinq. "Est-ce qu'on exagère pas un peut la puissance de cette potion magique?"
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  17. #97
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut

    Citation Envoyé par alassanediakite Voir le message
    Salut
    ZINEZINETI: six 9 à fsmrel tandis que les serveurs n'en ont que cinq. "Est-ce qu'on exagère pas un peut la puissance de cette potion magique?"
    Bonsoir alassanediakite,
    C'est une question de chiffres significatifs et d'incertitude absolue !
    Exemple : Si tu dis par exemple que la distance entre ta maison et la gare de train la plus proche est de 99,9999 mètres, tu vois que le 0,9999 mètre n'apportent aucune précision à la notion de distance entre ta maison et la gare. Dans ce cas là le chiffre 99,9999 m n'est pas significatif . Par contre une personne qui répond de façon excellente à 999999 questions sur 1000000 fait avec exactitude un pourcentage 99,9999% de bonnes réponses et le chiffre 99,9999% dans ce cas a un sens ! on peut prendre d'autres exemples ...

    99,9999 g d'or <-> 99,9999 g de poisson
    ..... <-> .....
    Etienne ZINZINDOHOUE
    Billets-Articles

  18. #98
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    5 975
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 5 975
    Points : 18 830
    Points
    18 830
    Billets dans le blog
    15

    Par défaut Euh...

    Le rouge de la confusion m’envahit... Vous présumez de mes forces, un million de réponses en près de 6 ans, ça fait une p... de moyenne quotidienne, même Stakhanov n’aurait pas tenu la cadence !
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  19. #99
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2010
    Messages : 1 278
    Points : 2 795
    Points
    2 795

    Par défaut

    Citation Envoyé par fsmrel Voir le message
    Le rouge de la confusion m’envahit... Vous présumez de mes forces, un million de réponses en près de 6 ans, ça fait une p... de moyenne quotidienne, même Stakhanov n’aurait pas tenu la cadence !
    c'est par extrapolation
    Etienne ZINZINDOHOUE
    Billets-Articles

  20. #100
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 257
    Points : 39 959
    Points
    39 959
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par zinzineti Voir le message
    La norme SQL n'a jusqu'à ce jour rien prévu pour le stockage de type donnée IP. Inutile de rappeler ici l'importance et la place de l'adresse ip dans le monde professionnel et personnel. A-t-on besoin de stocker des adresses IP dans une base de donnée relationnelles ? Voici une réponse
    Et pourtant rien n'est fait côté SQL Server pour mettre à disposition un type capable de stocker une adresse ip et faciliter les opérations sur cette donnée.
    Côté Oracle pareil. Du moins jusqu'à ce jour.

    Prenons un cas pour illustrer le besoin :
    Comment faire simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IP_ADR FROM myTable WHERE IP_ADR > IP_ADR_MIN AND IP_ADR  < IP_ADR_MAX
    Bien sûr, en bidouillant avec la fonction PARSENAME de SQL Server on peut trouver une porte de sortie pour les IP stockés comme des types de caractères... Mais on ne gagne ni en productivité ni lisibilité ni en performance ...!

    Saluons au passage le travail des développeurs du SGDB PostgreSQL sur ce point . PostgreSQL offre des types de données pour stocker IPv4, IPv6 et MAC ADRESSE. Les types CIDR et INET fournis par PostgreSQL permettent de stocker et d'effectuer des opérations ( =, >, <, <>,..) sur les adresses IP (IPv4 et IPv6)

    Qu'est ce que les "grands" éditeurs de SGBD attendent ?
    Totalement inutile.

    Une adresse IP est un entier 32 bits qui par convention est présenté sous forme de 4 entiers d'un octet.
    C'est donc au niveau de la vue ou pour certains traitement que cette présentation par 4 entiers doit se faire.

    Le problème c'est que les développeurs oublient toujours qu'on doit développer les applications sur des vues (modèle externe) et jamais sur des tables...

    En sus, nous en somme à l'IPV6 !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Discussions similaires

  1. Qu'est ce que cela veux dire un "code propre" selon-vous ?
    Par kagura dans le forum Général Conception Web
    Réponses: 45
    Dernier message: 09/02/2016, 14h22
  2. Quel est selon-vous le système idéal à la maison ?
    Par Community Management dans le forum Linux
    Réponses: 77
    Dernier message: 19/11/2015, 09h24
  3. Réponses: 51
    Dernier message: 15/03/2011, 15h51
  4. Quel est le meilleur générateur d'états selon vous ?
    Par Marc Lussac dans le forum Outils de restitution et d'analyse
    Réponses: 80
    Dernier message: 18/05/2010, 16h43
  5. Quel est selon vous le meilleur AV du marché ?
    Par lavazavio dans le forum Sécurité
    Réponses: 6
    Dernier message: 10/10/2005, 08h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo