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 :

Création d'un déclencheur


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut Création d'un déclencheur
    Bonjour, a toute et a tous

    j'ai besoin d'aide sur un code sql pour faire un déclencheur .
    Créez un déclencheur sur la table « s_item » qui va s’assurer de modifier le contenu de la colonne amount_in_stock de la table « s_inventory » à chaque insertion d’un item (table s_item) et qui va s’assurer que la nouvelle valeur ne soit pas supérieure à la valeur de « max_in_stock ». Lorsque c’est le cas, la valeur de la colonne « quantity » de la table « s_item » est ajustée.
    voila mon code , j'arrive a bloqué la mis a jour sur la table s_inventory si la colonne amount_in_stock et superieur a max_in_stock , mais la colonne quantity sur la table s_item elle se mis a jour, alors que la condition et que le quantité ajouté + amount_in_stock ne devrais pas dépasser le max_in_stock
    merci, pour votre aide
    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
     
    CREATE or ALTER TRIGGER T1 ON s_item
    FOR INSERT
    AS
    begin
    declare @id_ord decimal (7,0)
    declare @id_item decimal (7,0)
    declare @id_product decimal (7,0)
    declare @Qte decimal (9,0)
    DECLARE @DIFF decimal (9,0)
    DECLARE @max_in_stock    decimal (9,0)
     
    select @id_ord=ord_id,@id_item=item_id, @id_product=product_id, @Qte=quantity from inserted
    select @max_in_stock = max_in_stock from s_inventory inserted
    UPDATE s_item SET quantity = @Qte
    where  ord_id = @id_ord   and @Qte < @max_in_stock
    update  s_inventory  Set amount_in_stock = amount_in_stock +@Qte
    where product_id=@id_product and amount_in_stock < @max_in_stock
     
     
    end

  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 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Votre déclencheur est faux car il considère qu'il n'y a qu'une seule ligne dans la table inserted. Or les déclencheurs SQL Server sont toujours ensemblistes. Il voient donc passer un ensemble de ligne dans la table inserted. La présence de variable, va prendre au hasard les valeurs d'une ligne...

    Reconcevez votre déclencheur pour qu'il soit ensembliste. Eliminez toutes variables...

    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    je vais le refaire et voir . Merci

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    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
     
    CREATE or ALTER TRIGGER T1 ON s_item
    FOR INSERT
    AS
    begin
    declare @id_ord decimal (7,0)
    declare @id_item decimal (7,0)
    declare @id_product decimal (7,0)
    declare @Qte decimal (9,0)
    DECLARE @DIFF decimal (9,0)
    DECLARE @max_in_stock    decimal (9,0)
    DECLARE @id_warehouse decimal (7,0)
    DECLARE @amount_in_stock decimal (9,0)
     
    SELECT @id_ord=ord_id,@id_item=item_id, @Id_product=product_id,@Qte=quantity from inserted
    SELECT @id_warehouse = warehouse_id, @amount_in_stock=amount_in_stock, @max_in_stock=max_in_stock FROM s_inventory WHERE product_id=@id_product
    UPDATE s_inventory SET @amount_in_stock+=@Qte WHERE product_id=@ID_product AND @id_warehouse=warehouse_id
    SET @DIFF = @max_in_stock-@amount_in_stock
    IF (@DIFF < 0)
    BEGIN
    SET @Qte = @Qte+(@DIFF)
    UPDATE s_item SET @Qte =@Qte WHERE ord_id=@Id_ord
    UPDATE s_inventory SET amount_in_stock+=@Qte WHERE product_id=@ID_product AND @id_warehouse=warehouse_id
    END
    ELSE
    BEGIN
    UPDATE s_inventory SET amount_in_stock+=@Qte WHERE product_id=@ID_product AND @id_=warehouse_id
    END
    UPDATE s_item SET quantity= @Qte WHERE product_id=@ID_product
    END

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Non, non et non.... Vous ne devez avoir aucune variable locale dans votre curseur.... En effet que se passe t-il s'il y a insertion de plusieurs lignes simultanément ?


    Avec vos variables une seule ligne sera traitée et la ligne traitée sera prise au hasard... !

    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 or ALTER TRIGGER T1 ON s_item
    FOR INSERT, UPDATE
    AS
    IF EXISTS(SELECT * 
              FROM   inserted AS i
    			     JOIN s_inventory AS ivt
    				    ON itm.product_id = ivt.product_id
    		  WHERE  amount_in_stock < quantity)
    BEGIN
       ROLLBACK;
       RAISERROR ('Une des quantité demandée est supérieure à l''offre en stock. Annulation de l''opération.', 16, 1);
       RETURN;
    END;
     
    UPDATE ivt
    SET    amount_in_stock = amount_in_stock - quantity 
    FROM   s_inventory AS ivt
           JOIN inserted AS i
    	      ON itm.product_id = ivt.product_id;
    GO
    Autrement dit, s'il n'existe une ligne de la jointure de la table INSERTED des nouvelles valeurs d'item pour laquelle la quantité de produit demandée dépasse la quantité en stock, alors la transaction est annulée et je quitte le code en lançant un message d'erreur.

    Sinon, je met à jours l'ensemble des lignes jointes entre la table INSERTED des nouvelles valeurs d'item et la table des stocke en réajustant la quantité en stock.

    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [2008] Création déclencheur sur insertion
    Par hammouda311283 dans le forum Développement
    Réponses: 13
    Dernier message: 23/09/2014, 10h24
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. [Kylix] Création d'un fichier lien
    Par DrQ dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2002, 21h30
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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