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 :

Triggers ensemblistes et affectation d'une valeur de compteur


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Triggers ensemblistes et affectation d'une valeur de compteur
    Bonjour à tous,

    Je suis confronté à une problématique consistant à mettre en place un trigger sur une table (AFTER INSERT / AFTER UPDATE) destiné à affecter une valeur issue d'un compteur pour chacun des enregistrements . Et malheureusement, je ne peux pas utiliser AUTO_INCREMENT car je n'ai pas la possibilité de modifier la définition structurelle des colonnes de la table.

    Les informations des compteurs sont stockées dans une table très simple à trois colonnes (code compteur / valeur du compteur / incrément).

    Jusqu'à présent, j'avais écrit quelque chose ressemblant à cela :
    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
     
    DECLARE @ENTRYNO integer;
    SELECT @ENTRYNO = E_LIBREMONTANT2 FROM inserted;
    IF (@ENTRYNO = 0)
    BEGIN
    	IF (NOT EXISTS(SELECT 1 FROM DESEQUENCES WHERE DSQ_CODE = 'WJT~ZENTRYNO')) 
    	BEGIN
    		INSERT INTO DESEQUENCES(DSQ_CODE, DSQ_VALEUR, DSQ_INCREMENT) VALUES('WJT~ZENTRYNO', 0, 1)
    	END
     
    	UPDATE DESEQUENCES SET DSQ_VALEUR = DSQ_VALEUR + DSQ_INCREMENT WHERE DSQ_CODE = 'WJT~ZENTRYNO'
    	SELECT @ENTRYNO = DSQ_VALEUR FROM DESEQUENCES WHERE DSQ_CODE = 'WJT~ZENTRYNO'
     
    	UPDATE ECRITURE SET E_LIBREMONTANT2 = @ENTRYNO FROM ECRITURE INNER JOIN inserted Ecr ON Ecr.E_cleunique = ECRITURE.E_cleunique 
    END
    Mais je viens d'apprendre que la table inserted peut comporter plusieurs enregistrements (triggers ensemblistes).
    Et là, je comprends rapidement que mon code SQL ne peut pas convenir et je ne vois pas trop comment faire...
    Auriez-vous un conseil à me donner ?

    Merci.

  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 897
    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 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Créez une procédure qui va capturez la valeur du compteur et l'incrémenter d'autant de clef que nécessaire... J'ai déjà écrit sur ce sujet il y a fort longtemps :
    https://sqlpro.developpez.com/cours/clefs/

    Exemple :

    1) La table des clefs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE DESEQUENCES  
    (DSQ_CODE       VARCHAR(32) PRIMARY KEY,
     DSQ_KEY        BIGINT NOT NULL DEFAULT 1);
    GO
    2) la procédure de calcul des clefs :
    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 PROCEDURE P_GET_KEYS @CODE VARCHAR(32), @NBR_KEYS INT, @VAL_KEY BIGINT OUTPUT
    AS
    SET NOCOUNT ON;
    IF @NBR_KEYS IS NULL
       SET @NBR_KEYS = 1;
    IF NOT EXISTS(SELECT * 
                  FROM   DESEQUENCES
                  WHERE  DSQ_CODE= @CODE)
    BEGIN
       INSERT INTO  DESEQUENCES
       SELECT @CODE, @NBR_KEYS + 1 ;
       SET @VAL_KEY = 1;
       RETURN;
    END;
    UPDATE DESEQUENCES
    SET    DSQ_KEY = DSQ_KEY + @NBR_KEYS,
           @VAL_KEY = DSQ_KEY
    WHERE  DSQ_CODE = @CODE;
    GO
    3) Un test (que vous pouvez répéter autant de fois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @KEY BIGINT;
    EXEC P_GET_KEYS 'toto', 3, @KEY OUTPUT;
    SELECT @KEY AS FIRST_KEY;
    Vous devez ensuite modifier votre déclencheur

    Postez votre code pour plus d'aide. Notamment les CREATE TABLE.

    A +

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2006, 09h39
  2. Affectation d'une valeur dans un formulaire
    Par japz dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/03/2006, 15h02
  3. [VBA]Affectation d'une valeur à une cellule par une fonction
    Par lallougri dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/02/2006, 14h24
  4. [VBA-E] affectation d'une valeur a une variable
    Par benjamin.leouzon dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/02/2006, 11h47
  5. Réponses: 5
    Dernier message: 18/11/2005, 22h11

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