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 :

requete de constraint


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut requete de constraint
    bonjour
    j'ai 3 tables client,produit,achat

    client(nomcl,prncn,compte)
    produit(nompro,prixpro)
    achat(codcl,codpro,qtachat)

    je veux une constraint qui vérifier la totalité de la somme de qtachat et le compte de client.
    c'est a dire il faut etre le qtachat*prixprod <compte alors pour insert dans la table achat il faut verifier cette condition

    voila ma requete:

    create table achat

    (codcl integer,codpro integer,qt integer,

    constraint vercod check (qt *(select prixpod from produit)<(select compte

    from client))

    je vous remerci d'avance

  2. #2
    Membre averti Avatar de bouvda
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 252
    Points : 318
    Points
    318
    Par défaut
    Bonjour,

    votre requête serait plus quelque chose dans ce style :
    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
    CREATE TABLE achat(codcl int,codpro int,qt int);
    GO
    CREATE FUNCTION montant(@qt int) /*PRODUIT ?*/
    RETURNS float
    AS
    BEGIN
    DECLARE @prix float
    SELECT @prix=prixprod FROM produit /*WHERE PRODUIT...*/
    RETURN @qt*@prix
    END;
    GO
    CREATE FUNCTION solde() /*CLIENT ?*/
    RETURNS float
    AS
    BEGIN
    DECLARE @solde float
    SELECT @solde=compte FROM client /*WHERE CLIENT...*/
    RETURN @solde
    END;
    GO
    ALTER TABLE achat
    ADD CONSTRAINT vercod CHECK (montant(qt)<solde());
    GO
    Attention cependant ça ne fonctionnera pas car il manque un paramètre à donner pour les 2 fonctions. Dans la première il faut connaître le produit et ajouter une clause WHERE pour ne sélectionner que le prix de ce produit et dans la seconde fonction il manque le client.

  3. #3
    Nouveau membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 25
    Points
    25
    Par défaut
    Ce coup-ci, il va bien falloir que tu te mettes aux TRIGGER !!

    http://sql.developpez.com/sqlserver/transactsql/#L5

    Et puis, juste pour être sûr :

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    bonjour

    j'ai pas compri votre remarque 'il te manque un paramtre...., et la close where'
    j'ai utiliser votre requete mais il m'affiche une erreur la voila

    Server: Msg 170, Level 15, State 1, Procedure montant, Line 8
    Line 8: Incorrect syntax near ';'.
    Server: Msg 170, Level 15, State 1, Procedure solde, Line 8
    Line 8: Incorrect syntax near ';'.
    Server: Msg 195, Level 15, State 10, Line 2
    'montant' is not a recognized function name.

    pourriez vous m'aider je suis débutant et je vous remerci

  5. #5
    Membre averti Avatar de bouvda
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 252
    Points : 318
    Points
    318
    Par défaut
    J'avais également mal compris ce que vous vouliez, il ne manque donc pas de paramètre mais il faut passer par un trigger comme l'indique Divadz.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    bonjour

    votre requete elle m'affiche une errure et j'ai pas compris les paramatres quand on ajoute dans les 2 fonctions el dans la clause where

    je vous remerci d'avance

  7. #7
    Membre averti Avatar de bouvda
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 252
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par DJERDJAR YACINE
    bonjour

    votre requete elle m'affiche une errure et j'ai pas compris les paramatres quand on ajoute dans les 2 fonctions el dans la clause where

    je vous remerci d'avance
    c'est "normal" qu'elle ne fonctionne pas et affiche des erreurs mais de toute façon elle ne fait pas ce que vous voulez .
    Pour faire ce que vous voulez il faut utiliser un trigger après l'insertion des données.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    bonjour bouvda

    je suis débutant en sql et j'aimerai bien vous m'aider comment on creé un trigger dans ce cas pour marcher bien SVP.

    je vous remerci d'avance

  9. #9
    Membre averti Avatar de bouvda
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 252
    Points : 318
    Points
    318
    Par défaut
    Il y a longtemps que je n'ai pas touché aux triggers donc je ne vais pas m'avancer mais le lien donné par Divadz peut aider.
    Il y a aussi de quoi faire sur MSDN :
    http://technet.microsoft.com/fr-fr/l.../ms189799.aspx

  10. #10
    Nouveau membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 25
    Points
    25
    Par défaut
    Tiens, je te file un exemple complet qui correspond à ta problématique, mais que ça ne t'empêche pas de te documenter...

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    CREATE TABLE Client
    (CodCL    int IDENTITY(1, 1)
    ,NomCL    varchar(30)
    ,PrenomCL varchar(30)
    ,Compte   float
    ,CONSTRAINT PK_Client PRIMARY KEY (CodCL)
    )
     
    CREATE TABLE Produit
    (CodPro  int IDENTITY(1, 1)
    ,NomPro  varchar(30)
    ,PrixPro float
    ,CONSTRAINT PK_Produit PRIMARY KEY (CodPro)
    )
     
    CREATE TABLE Achat
    (CodCL  int NOT NULL
    ,CodPro int NOT NULL
    ,qt     int NOT NULL
    ,CONSTRAINT PK_Achat PRIMARY KEY (CodCL, CodPro)
    ,CONSTRAINT FK_Achat_CodCL FOREIGN KEY (CodCL) REFERENCES Client(CodCL)
    ,CONSTRAINT FK_Achat_CodPro FOREIGN KEY (CodPro) REFERENCES Produit(CodPro)
    )
    GO
    CREATE TRIGGER Verif_Solde_Client ON Achat
    INSTEAD OF INSERT
    AS BEGIN
        DECLARE @MontantTransaction float
        DECLARE @SoldeClient float
        SET @MontantTransaction = (SELECT qt * PrixPro FROM INSERTED INNER JOIN Produit ON Inserted.CodPro = Produit.CodPro)
        SET @SoldeClient = (SELECT Compte FROM INSERTED INNER JOIN Client ON Inserted.CodCL = Client.CodCL)
        PRINT @MontantTransaction
        PRINT @SoldeClient
        IF @MontantTransaction <= @SoldeClient
            INSERT INTO Achat SELECT * FROM INSERTED
    END
    GO
    INSERT INTO Client (NomCL, PrenomCL, Compte) VALUES('Jean', 'Brugnat', 123.45)
    INSERT INTO Client (NomCL, PrenomCL, Compte) VALUES('Jeanne', 'Serva', 456.78)
    INSERT INTO Client (NomCL, PrenomCL, Compte) VALUES('Gilles', 'Hollu', 159.26)
     
    INSERT INTO Produit (NomPro, PrixPro) VALUES('Pomme', 1)
    INSERT INTO Produit (NomPro, PrixPro) VALUES('Banane', 2)
    INSERT INTO Produit (NomPro, PrixPro) VALUES('Ananas', 3)
     
    INSERT INTO Achat VALUES(2, 3, 100)
    INSERT INTO Achat VALUES(1, 2, 50)
    INSERT INTO Achat VALUES(3, 1, 200)
    GO
    SELECT * FROM Achat
    Si tu regardes le code, tu verras que la troisième insertion dans la table achat ne correspond pas aux critères que tu as définis... Et qu'en effet, elle ne se fait pas !

  11. #11
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    bonjour

    oui elle marche tré bien

    je vous remerci

  12. #12
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    bonjour

    j'ai 2 tables client et achat
    1)client(codcl,nomcl,prncl,villecl)
    2)achat(codcl,codprod,dateachat,qtachat)==> codprod=code produit
    je veux faire une condition pour inserer dans la table achat 2 client de la ville 'paris' et les autres clients sont libre et pour ce la j'ai creé un trigger
    voila mon trigger
    create trigger ver_place on achat instead of insert
    as begin
    declare @sumparis integer
    set @sumparis=(select count(*) from inserted inner join client
    on client.codcl=inserted.codcl
    and villecl='paris')

    if(@sumparis<=2)
    begin
    insert into achat select * from inserted
    end
    else
    begin
    print('complet')
    end
    end

    mon trigger est marche tri bien mais la table achat est accepte plus 2 client de ville(paris)donc il ne verifier pas la condition sur la ville(paris)

    je vous remerci d'avance

  13. #13
    Nouveau membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 25
    Points
    25
    Par défaut


    Essaie ça plutôt :
    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
    CREATE TRIGGER ver_place ON achat
    INSTEAD OF INSERT
    AS BEGIN
     
        DECLARE @ville nvarchar(50)
        SET @ville=(SELECT villecl
                    FROM Client inner join inserted ON client.codecl = inserted.codecl)
     
        IF @ville = 'paris' BEGIN
     
            DECLARE @sumparis int
            SET @sumparis=(SELECT COUNT(*) FROM inserted
                        WHERE codecl IN (SELECT codcl 
                                        FROM Client 
                                        WHERE villecl = 'paris')
     
            IF @sumparis < 2 BEGIN
                INSERT INTO achat SELECT * FROM inserted
            END ELSE BEGIN
                PRINT('complet')
            END
     
        END ELSE BEGIN
            INSERT INTO achat SELECT * FROM inserted
        END
     
    END
    J'ai pas testé, mais tu vois la philosophie...

Discussions similaires

  1. Requete d'insertion : constraint violated
    Par BenHoit dans le forum SQL
    Réponses: 11
    Dernier message: 23/07/2009, 11h16
  2. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  3. Requete requête sous sybase
    Par eddie dans le forum Sybase
    Réponses: 3
    Dernier message: 02/04/2003, 14h51
  4. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22

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