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

Développement SQL Server Discussion :

Problème de contraine check


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Par défaut Problème de contraine check
    Je veux ajouter une contrainte de vérification au moment d'insertion d'une valeur dans la première table qui doit être inexistante dans la deuxième table.
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE RubriqueS(
    CRubriqueS	VARCHAR(30)   NOT NULL ,
    LibRubriqueS     VARCHAR(30)  NULL
    )
     
    CREATE TABLE RubriqueC(
    CRubriqueC	VARCHAR(30)   NOT NULL ,
    LibRubriqueC     VARCHAR(30)  NULL
    )
     
    ALTER TABLE RubriqueS 
      ADD CONSTRAINT ch_CRubriqueS 
        CHECK (CRubriqueS NOT IN(SELECT CRubriqueC FROM RubriqueC))
    mais il génère les erreurs suivantes :
    Serveur*: Msg 8142, Niveau 16, État 1, Ligne 1
    Subqueries are not supported in CHECK constraints, table 'RubriqueS'.
    Serveur*: Msg 1759, Niveau 16, État 1, Ligne 1
    Invalid column 'CRubriqueC' is specified in a constraint or computed-column definition.
    Serveur*: Msg 1750, Niveau 16, État 1, Ligne 1
    Could not create constraint. See previous errors.
    Cdt,

  2. #2
    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
    Par défaut
    Tu ne peux pas crée une telle contrainte.

    Tu peux faire un trigger INSTEAD OF INSERT qui lancera une exception si une tentative d'insertion ne répondait pas à ta règle.

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Tu ne peux pas crée une telle contrainte.

    Tu peux faire un trigger INSTEAD OF INSERT qui lancera une exception si une tentative d'insertion ne répondait pas à ta règle.
    Ok je vais essayer ta solution et merci

  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 : 44
    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
    Par défaut
    Bonjour,

    On peut tout à fait créer une fonction définie par l'utilisateur et la faire appliquer par une contrainte CHECK.
    Il faut réserver les triggers à l'application de règles métier complexes, en gardant toujours à l'esprit que les triggers sont gourmands en ressources, et que le code du trigger fait partie de la transaction qui l'a déclenché.

    Voici donc un exemple de fonction :

    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
    CREATE FUNCTION dbo.maFonction (@CRubriqueS VARCHAR(30))
    	RETURNS BIT
    	WITH SCHEMABINDING
    AS
    BEGIN
    	DECLARE @bOK BIT SET @bOK = 1
     
    	IF EXISTS
    	(
    		SELECT 1
    		FROM dbo.RubriqueC
    		WHERE CRubriqueC = @CRubriqueS
    	)
    	BEGIN
    		SET @bOK = 0
    	END
     
    	RETURN @bOK
    END
    Dès lors la spécification de la contrainte devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.RubriqueS 
    ADD CONSTRAINT ch_CRubriqueS 
    CHECK (dbo.maFonction(CRubriqueS) = 1)
    @++

  5. #5
    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 : 44
    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
    Par défaut
    Concernant les RBAR, j'ai publié un petit billet sur un des cas qui les provoquent ...

    Prouvez-nous qu'écrire une fonction pour spécifier une contrainte de domaine est un traitement qui provoque le RBAR ...

    @++

  6. #6
    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
    Par défaut
    Voici la preuve.

    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
     
    CREATE FUNCTION dbo.maFonction (@CRubriqueS VARCHAR(30))
        RETURNS BIT
        WITH SCHEMABINDING
    AS
    BEGIN
        DECLARE @bOK BIT SET @bOK = 1
     
        IF EXISTS
        (
            SELECT 1
            FROM dbo.RubriqueC
            WHERE CRubriqueC = @CRubriqueS
        )
        BEGIN
            SET @bOK = 0
        END
     
        RETURN @bOK
    END


    @++

Discussions similaires

  1. Problème dans mon check
    Par bsangoku dans le forum Langage SQL
    Réponses: 8
    Dernier message: 30/03/2011, 08h35
  2. Après téléchargement problème d'integrity check
    Par batou22003 dans le forum Windows XP
    Réponses: 0
    Dernier message: 08/12/2010, 23h45
  3. [9i][Check constraint] Problème d'update
    Par natha dans le forum Oracle
    Réponses: 5
    Dernier message: 14/01/2007, 21h02
  4. [VS 2005] [MenuStrip] Problème avec "checked"
    Par Gold.strike dans le forum Visual Studio
    Réponses: 1
    Dernier message: 22/08/2006, 17h22
  5. problème insoluble avec CHECK
    Par NiBicUs dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 25/03/2004, 17h13

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