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 :

TimeStamp avec sélection multiple


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut TimeStamp avec sélection multiple
    Bonjour,
    J'ai un petit problème avec les TimeStamp que je ne sais pas comment résoudre.

    Afin de protéger la base des accès concurent je dois vérifier le timestamp avant de faire une mise à jour :

    SELECT @Id = MonId, @TimeStampParam = MonTimeStamp
    FROM MaTable
    ...
    UPDATE MaTable
    Set Champ1 = 'Nouvelle valeur'
    WHERE
    MonId = @Id
    TsEqual(MonTimeStamp, @TimeStampParam)

    Jusque là aucun problème, mais je dois faire la même action sur un ensemble de lignes.
    Mais je n'ai aucune idée de comment faire. J'ai penser à utiliser le Max des TimeStamp mais sans succès.
    -->
    WHERE
    MonId IN (@Id1, @Id2, @Id3, @Id4, @Id5, @Id6, @Id7, @Id8, @Id9)
    ???

    Merci d'avance pour toute aide potentielle.
    Chris

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations forums :
    Inscription : Novembre 2007
    Messages : 125
    Points : 92
    Points
    92
    Par défaut
    Bonjour, apriori le timestamp est donnée par ton serveur, donc je vois pas en quoi cela peut t'aider, si tu veux empêcher la concurrence, il y les connections sécurisés.

    chaque personne qui se connecte à ta db doit se connecter, donc tu peut limiter les accès à ce niveau.^^

    ou bien je n'ai pas compris ton probleme.
    +++

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    Mon problème est simple, sur mon application web je dois gérer les accès concurents aux données.
    D'une manière générale c'est très simple :
    - je charge mon objet en base avec le timestamp pour l'afficher à l'écran,
    - lors de la sauvegarde je vérifie que le timestamp n'a pas été modifié par un autre utilisateur (utilisation de la fonction TsEqual + gestion d'erreur associée).

    Mais dans mon cas j'affiche une liste d'éléments et je désire faire une mise à jour sur un ensemble de lignes.
    Or je veux être sûr qu'entre l'affichage / la sélection de mes éléments dans ma liste et l'exécution de ma modification, personne n'a modifié l'un des éléments sélectionnés.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    N'ayant pas eu de réponse concluante j'ai continué mes recherches et je pense avoir mis la main sur une solution.
    Je reste cependant ouvert à toute critique tout en espérant que ça fonctionne correctement.

    Pour commencer, on suppose que les variables suivantes sont déjà renseignées (elles seront récupérées par une autre procédure stockée, puis renvoyé comme paramètre) :
    DECLARE @OldTsMax timestamp

    --> On récupère le TimeStamp Max de toutes les lignes nécessitant éventuellement la modification
    SELECT @OldTsMax = MAX(timestamp_dd) FROM DD
    WHERE DD.sy_decla_dpot IN ('581','755','758','762', '2106')



    La mise à jour se fera alors par la requête suivante :
    UPDATE DD
    SET champ_a_modifier = 'nouvelle valeur'
    FROM DD
    WHERE DD.sy_decla_dpot IN ('581','755') --> sous ensemble de la liste précédente
    AND TsEqual(DD.timestamp_dd,
    CASE
    -- Si le TimeStamp est supérieur à tous les anciens TimeStamp alors il y a eu une modification depuis le chargement
    WHEN DD.timestamp_dd > @OldTsMax THEN @OldTsMax
    -- Sinon le TimeStamp est inférieur alors il n'a pas été modifié depuis le dernier chargement
    ELSE DD.ts_decla_dpot
    END)

    L'idée général est qu'il y a eu modification uniquement si le TimeStamp de la ligne est supérieur au TimeStamp Max de la sélection de départ.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 93
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    N'ayant pas eu de réponse concluante j'ai continué mes recherches et je pense avoir mis la main sur une solution.
    Je reste cependant ouvert à toute critique tout en espérant que ça fonctionne correctement.

    Pour commencer, on suppose que les variables suivantes sont déjà renseignées (elles seront récupérées par une autre procédure stockée, puis renvoyé comme paramètre) :
    DECLARE @OldTsMax timestamp

    --> On récupère le TimeStamp Max de toutes les lignes nécessitant éventuellement la modification
    SELECT @OldTsMax = MAX(timestamp_dd) FROM DD
    WHERE DD.sy_decla_dpot IN ('581','755','758','762', '2106')



    La mise à jour se fera alors par la requête suivante :
    UPDATE DD
    SET champ_a_modifier = 'nouvelle valeur'
    FROM DD
    WHERE DD.sy_decla_dpot IN ('581','755') --> sous ensemble de la liste précédente
    AND TsEqual(DD.timestamp_dd,
    CASE
    -- Si le TimeStamp est supérieur à tous les anciens TimeStamp alors il y a eu une modification depuis le chargement
    WHEN DD.timestamp_dd > @OldTsMax THEN @OldTsMax
    -- Sinon le TimeStamp est inférieur alors il n'a pas été modifié depuis le dernier chargement
    ELSE DD.timestamp_dd
    END)

    L'idée général est qu'il y a eu modification uniquement si le TimeStamp de la ligne est supérieur au TimeStamp Max de la sélection de départ.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection multiples de cellules avec des variables
    Par John81 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 31/08/2008, 20h12
  2. Lancer une procédure avec "Worksheet_Change" sur une sélection multiple
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/06/2008, 11h29
  3. Réponses: 1
    Dernier message: 13/01/2008, 01h39
  4. Liste déroulante avec sélection multiple
    Par lbar012001 dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/11/2007, 09h44
  5. Réponses: 24
    Dernier message: 01/12/2005, 16h54

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