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 :

Un seul enregistrement ?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut Un seul enregistrement ?
    Bonjour,
    Après quelques recherches dans la FAQ et le forum, je ne trouve pas spécialement de réponse à ma question.
    Tout d'abord Je ne suis pas un grand spécialiste de SQL, mais j'essaie de m'adapter.

    Les faits :
    Pour l'instant c'est l'étude rien a été fait.
    Je vais avoir besoin dans une base (à ma disposition SQL SERVER 7 ou 2000) d'afficher chaque enregistrement d'une table et d'enregistrer les modifications. Tous les enregistrements vont devoir être traités.
    Plusieurs utilisateurs (une petite dizaine) vont avoir chaque enregistrement remonter automatiquement (php ou asp)
    J'envisageais de mettre un statut sur chaque enregistrement (du style a traiter,traité) mais comment s'assurer que 1 utilisateur n'aura pas le même enregistrement qu'un autre.
    Je pensais tout d'abord lors du SELECT (sur le 1er élément "à traiter" faire un UPDATE pour passer son statut "en cours") mais j'ai peur que le temps de faire la modification sur le statut "en cours", ce même enregistrement remonte pour 1 autre utilisateur.

    Ne sachant comment aborder ce problème de façon sécurisé je me tourne vers vous afin de m'orienter.

    Merci par avance.

    NicoDD.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Lors d'une "demande pour un enregistrement" de l'application,
    tu peux envoyer à SQL Server le nom d'utilisateur (qu'on suppose unique !) de l'application.
    En plus d'une colonne "statut", tu peux ajouter une colonne "Attribution" et y placer le nom de l'utilisateur ayant "réclamé" un enregistrement.
    récupération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM maTable WHERE Status = 'en cours' AND Attribution = 'Wladimir'
    Cela permettra de savoir aussi qui a fait quoi comme traitement.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut
    Merci pour ta réponse....
    Donc si j'ai bien compris :

    1: je fait un SELECT sur le premier enregistrement disponible (statut en cours) puis fait un UPDATE de attribution (qui sera sans données au départ) avec pour données le nom unique de l'utilisateur.

    2. je récupère cet enregistrement et l'affiche à l'utilisateur concerné.

    Si échec en 2. car un autre utilisateur a fait une demande attribution en même temps sur le même enregistrement je recommence 1.

    Ai-je bien tout compris ?

    Merci.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Il n'y aura pas d'échec ...

    Il faut utiliser la baguette magique de la transaction
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut
    Il n'y aura pas d'échec ...

    Il faut utiliser la baguette magique de la transaction
    J'ai peur de ne pas être le Harry Potter de la Transaction....

    Si tu peux m'éclairer.....


    Merci.

    Nico

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    C'est probablement encore plus simple.
    On suppose que chaque enregistrement est numéroté par un compteur (clé primaire recommandée).
    Donc une application cliente va envoyer directement la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE maTable SET Statut = 'en cours', Attritution = 'Hector' 
    WHERE Compteur = (SELECT MIN(Compteur) 
    FROM maTable WHERE Statut = 'à traiter')
    Comme on fait la manoeuvre en une seule instruction, on n'a pas vraiment besoin de transaction

    Après, on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM maTable 
    WHERE Statut = 'en cours' AND Attritution = 'Hector'
    Sinon, pour être "ceinture et bretelles" avec une transaction, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BEGIN TRANSACTION
    UPDATE maTable SET Statut = 'en cours', Attritution = 'Hector' 
    WHERE Compteur = (SELECT MIN(Compteur) FROM maTable WHERE Statut = 'à traiter')
    SELECT * FROM maTable 
    WHERE Statut = 'en cours' AND Attritution = 'Hector'
    COMMIT
    Si quelque chose foire au milieu, la base se remet dans son état d'avant la transaction
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

Discussions similaires

  1. Sous-formulaire avec 1 seul enregistrement
    Par Farbin dans le forum Access
    Réponses: 6
    Dernier message: 08/08/2006, 16h37
  2. [Access 2003]Comment obtenir un seul enregistrement?
    Par steeves5 dans le forum Access
    Réponses: 19
    Dernier message: 28/04/2006, 12h05
  3. Réponses: 1
    Dernier message: 26/04/2006, 09h52
  4. Voir un seul enregistrement
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 15/11/2004, 16h51
  5. ROLLBACK sur une seul enregistrement
    Par toctoc80 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/04/2004, 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