IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Ce qui se passe à un check non respecté


Sujet :

MS SQL Server

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Ce qui se passe à un check non respecté
    Bonjour!

    J'aimerais savoir ce qui se passe lorsque la condition d'une contrainte n'est pas respectée?
    Mon cas, c'est que je suis presque sur que la condition parmi les 4 sur une table est fausse or l'insertion se fait toujours! Un autre cas: l'unique condition check (d'une autre table) est fausse, encore aucun message d'exception mais l'insertion ne se fait pas pour ce cas. Pourquoi?
    En fait, je ne sais si ça a quelque chose à avoir mais j'exécute les insertions dans un prog utilisant ADO (OLEDB)!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 858
    Points : 52 996
    Points
    52 996
    Billets dans le blog
    6
    Par défaut
    Lorsqu'il y a violation d'une contrainte, quelle qu'elle soit, l'ordre SQL est annulé.

    Si par exemple vous insérez dans une table 3 lignes à l'aide d'un seul et même ordre SQL et qu'une seule ligne viole une contrainte, alors aucune des 3 lignes n'est inséré, du fait de la notion d'atomicité des ordres SQL.

    Si vous insérez dans plusieurs tables sans gérer de transaction, seul l'ordre pour lequel le viol a eu lieu sera annulé.
    Si vous insérez dans plusieurs tables en plaçant le code dans une transaction, mais sans gérer les exception, seul l'ordre pour lequel le viol a eu lieu sera annulé.
    Enfin, si vous insérez dans plusieurs tables en plaçant le code dans une transaction et en gérant correctement les exceptions, alors vous pouvez entreprendre d'annuler toute la transaction (donc tous les INSERT) en invoquant l'ordre ROLLBACK de finalisation au lieu du COMMIT.

    Sur la gestion des transaction en général, lisez ce que j'ai écrit :
    http://sqlpro.developpez.com/cours/s...chniques/#L1.3

    A +

  3. #3
    bruce-willis
    Invité(e)
    Par défaut
    Lorsqu'il y a violation d'une contrainte, quelle qu'elle soit, l'ordre SQL est annulé.
    Donc, y a-t-il exception ? détectable dans une application
    N'existerait-il pas un bug qui permet quand même à l'ordre de se faire même s'il y a violation ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonsoir,

    Un petit test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TbTEST_CHECK
    (
    	numeroTel CHAR(10) NOT NULL CONSTRAINT CHK_TbTEST_CHECK_numeroTel CHECK (numeroTel LIKE '06[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
    )
    GO
     
    INSERT INTO TbTEST_CHECK VALUES ('06')
    Msg*547, Niveau*16, État*0, Ligne*1
    L'instruction INSERT est en conflit avec la contrainte CHECK 'CHK_TbTEST_CHECK_numeroTel'. Le conflit s'est produit dans la base de données 'ELSUKET', table 'dbo.TbTEST_CHECK', column 'numeroTel'.
    L'instruction a été arrêtée.
    L'erreur étant de niveau 16 (> 11 et < 19), elle est donc transmise à l'application sauf si vous la gérez dans une bloc TRY... CATCH.
    De même si votre bloc CATCH génère une exception de niveau compris entre 11 et 19, l'exception est transmise à l'application appelante.
    Si c'est plus de 19, alors la connexion prend fin.
    Si c'est moins de 11, seul un message d'information est généré, mais il est retourné à l'application et le bloc CATCH n'est pas appelé.

  5. #5
    bruce-willis
    Invité(e)
    Par défaut
    Ah bon, il y a des niveaux d'erreur en SQL Server ?? Mais une violation de check est élevée non?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Oui, puisqu'elle est de niveau 16, c'est à dire à résoudre par le développeur.

    Quand le niveau est compris entre 1 et 10, un message d'information est généré.
    Quand il est compris entre 11 et 19, une erreur est générée.
    Quand il est supérieur ou égal à 20 la connexion est coupée.

    Ainsi dans vos RAISERROR, vous pouvez spécifier un niveau, un état, et même un numéro de message que vous pouvez paramétrer avec
    sp_addmessage

Discussions similaires

  1. texte qui ce répète et Height non respecté sur IE6
    Par Strix dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/04/2007, 16h16
  2. [Oracle] Contrainte CHECK non respectée
    Par ms7 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/07/2006, 17h02
  3. Alter table qui ne passe...
    Par Gential dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/06/2003, 17h48

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