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

  1. #1
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut Test d’existence avant UPDATE d'un enregistrement

    Bonsoir à tous,

    Deux utilisateurs accèdent au même enregistrement. Le 1er supprime l’enregistrement le 2eme le vois toujours et pourrait l'editer et poster les modifications. Donc pour l’en empêcher puisque la ligne n’existe plus, j’essaye de faire un teste d’existence dans un Trigger update :

    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
     
    CREATE OR ALTER TRIGGER TEST_BU0 FOR TEST
    ACTIVE BEFORE UPDATE POSITION 0
    AS
    DECLARE VARIABLE RES INTEGER;
    DECLARE VARIABLE MES VARCHAR(100);
    BEGIN
     IF (COALESCE(NEW.ID,0)<>0) THEN
     BEGIN
     SELECT 1 FROM TEST WHERE ID=NEW.ID INTO :RES;
     RES=COALESCE(:RES,0);
      IF (:RES=0) THEN
      BEGIN
      MES ='L''ENREGISTREMENT A ETE SUPPRIMER';
      EXCEPTION NOT_FOUND  MES;
      END
     END
    END
    Cette méthode ne fonctionne pas et j’ai du dépanner avec un SELECT avant de faire l’UPDATE depuis le client pour tester l’existence de la ligne en attendant de trouver une solution qui pourrait s’appliquer dans un trigger. Pourriez-vous SVP m’eclairer ?
    Merci
    Le Savoir c'est le Pouvoir !
    S.Freud

  2. #2
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 879
    Points : 8 873
    Points
    8 873
    Billets dans le blog
    1

    Par défaut

    Ce problème est lié à une mauvaise gestion de l'isolation et du verrouillage l'ajout d'un trigger n'est pas la solution.

  3. #3
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut

    Bonjour,

    Oui mais lorsque l'enregistrement supprimé n'est pas tout de suite editer par le 2eme mais il pourrait le voir puisqu'il est déjà positionné dessus (dans une grid) il aurait suffit d'un simple rafraîchissement pour que la ligne disparaissent avant l'edition mais ne peut le faire dans ce contexte. Pour le niveau d'isolation j'utilise les paramètres suivant dans une transaction en ecriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tpConcurrency, tpWait,tpWrite
    Le Savoir c'est le Pouvoir !
    S.Freud

  4. #4
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut

    Citation Envoyé par escartefigue
    Ce problème est lié à une mauvaise gestion de l'isolation
    Je formulerais ma question autrement.
    Quand on fait un UPDATE d'un enregistrement qui n'existe plus dans la BDD le serveur devrait renvoyer ce type de message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Statement failed, SQLCODE = -901 
     cannot update erased record
    Il faudrait utiliser quel niveau d'isolation pour obtenir ce type de message ?
    Merci.
    Le Savoir c'est le Pouvoir !
    S.Freud

  5. #5
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 879
    Points : 8 873
    Points
    8 873
    Billets dans le blog
    1

    Par défaut

    Ne souhaitez vous pas éviter la mise à jour d'une ligne qui n'existe plus, plutôt que de générer un message d'erreur.
    Une isolation CS voire RR permet d'éviter le phénomène

  6. #6
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut

    Citation Envoyé par escartefigue
    Ne souhaitez vous pas éviter la mise à jour d'une ligne qui n'existe plus, plutôt que de générer un message d'erreur.
    Certainement, si vous faite allusion à la méthode que j'utilise en ce moment, le SELECT avant l'UPDATE mais elle me semble un peu lourd depuis le client car je dois démarrer 2 transactions :

    -SELECT/COMMIT

    et si teste OK

    -UPDATE/COMMIT


    Citation Envoyé par escartefigue
    voire RR permet d'éviter le phénomène
    Désolé, je n'ai pas compris RR

    Merci.
    Le Savoir c'est le Pouvoir !
    S.Freud

  7. #7
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 879
    Points : 8 873
    Points
    8 873
    Billets dans le blog
    1

    Par défaut

    RR comme Repeatable Read pardon

    Cf. https://www.firebirdsql.org/pdfmanua...nsactions.html

  8. #8
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut

    Je me suis compliquer la chose.
    Franchement la méthode utilisé était bourrin fallait simplement tester le RowAffected depuis le client et c'est tout
    Le Savoir c'est le Pouvoir !
    S.Freud

  9. #9
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    18 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 18 172
    Points : 42 508
    Points
    42 508

    Par défaut

    En plus d'être lourde, cette méthode ne garantit pas tous les cas de figure... En effet, l'ajout d'une ligne n'est pas concerné par les verrous du niveau d'isolation REPEATABLE READ .

    Mais je ne voit strictement aucun intérêt à faire ceci en 2 requêtes. Une seule suffit : envoyer l'UPDATE puis s'interroger sur le nombre de ligne mis à jour.

    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 557
    Points : 11 085
    Points
    11 085
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre confirmé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    mai 2002
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mai 2002
    Messages : 1 179
    Points : 601
    Points
    601

    Par défaut

    Bonjour tout le monde,

    Artemus24, merci pour les liens
    Le Savoir c'est le Pouvoir !
    S.Freud

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

Discussions similaires

  1. test existence avant INSERT
    Par richard038 dans le forum SQL
    Réponses: 3
    Dernier message: 19/02/2007, 17h16
  2. prob update du dernier enregistrement
    Par zorba49 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/01/2007, 09h15
  3. Mysql update supprime un enregistrement
    Par Langly dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/08/2006, 17h46
  4. Test de la présence d'un enregistrement
    Par nellynew dans le forum Access
    Réponses: 1
    Dernier message: 18/05/2006, 15h03
  5. Réponses: 2
    Dernier message: 28/11/2005, 10h12

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