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

SQL Oracle Discussion :

Verrouiller une table


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Verrouiller une table
    Bonsoir,
    J'ai un peu de mal à utiliser LOCK surtout que je comprnd pas trop les différents mode.
    Je souhaiterais verrouiller la table pour qu'on puisse encore insérer,eventuellement mettre à jour mais pas supprimer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LOCK TABLE <nomTable> ???
    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Malheureusement, ce n'est pas possible toutes les verrous traitent INSERT, UPDATE et DELETE de la même façon ...

    Quel est le besoin?
    Consultant et formateur Oracle

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    J'ai fais un TRiGGER qui archive une commande supprimée, je souhaite que cette commande ne puisse être supprimée de la table d'archivage.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Donc le besoin d'empêcher la suppression de lignes dans cette table est plutôt permanent ...

    Ceci peut être atteint en utilisant un trigger (delete) qui renvoie une erreur non capturée par le trigger lui même. L'effet du trigger dans ce cas est d'annuler la suppression
    Consultant et formateur Oracle

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par Michel SALAIS Voir le message
    utilisant un trigger (delete) qui renvoie une erreur non capturée par le trigger lui même. L'effet du trigger dans ce cas est d'annuler la suppression
    Je n'ai pas compris, surtout le passage "une erreur non capturée par le trigger lui même".
    Peux tu m'expliquer s'il te plais.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    En gros le core du trigger devrait ressembler à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    BEGIN
      reaise_application_error(-20001, 'Suppression impossible dans la table');
    END;
    Le trigger provoque une erreur en par conséquent l'instruction à l'origine de son déclenchement sera annulée.
    La capture éventuelle des erreurs par un bloc PL/SQL se fait si le bloc contient la section EXCEPTION.
    Consultant et formateur Oracle

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Donc il faut que je fasse un TRIGGER dans lequel je lève une exception?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER AFTER DELETE ON ArchiveCommande
    FOR EACH ROW
    BEGIN
      raise_application_error(-20001, 'Suppression impossible dans la table');
    END;
    /
    Que signifie le -20001 ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Ah!
    J'ai oublié de signaler que les erreurs que nous pouvons soulever avec raise_application_error sont obligatoirement dans l'intervalle -20999 .. -20000. Oracle ne produit aucune erreur interne ayant un code dans cet intervalle. C'est au développeur de bien gérer les erreurs en question.

    Le trigger n'a pas besoin de se déclencher pour chaque ligne ==> enlever la ligne 'FOR EACH ROW". Puis dans ce cas je préfère un trigger BEFORE.
    Consultant et formateur Oracle

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci beaucoup, donc on obtient cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE OR REPLACE TRIGGER verrou BEFORE DELETE ON HistoriqueF
    BEGIN
      raise_application_error(-20001, 'Suppression impossible dans la table');
    END;
    /
    Qu'en penses_tu?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Oui c'est bien ça ...
    Consultant et formateur Oracle

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci beaucoup, mais désolé d'insister, est-ce que -20001 correspond à une erreur particulière?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Je constate que je n'étais pas claire dans ma réponse sur ce point. La réponse est non. N'importe quelle erreur dans l'intervalle -20999 .. -20000 peut être utilisée et c'est au développement d'organiser l'utilisation de ces erreurs. Le moteur Oracle ne produit aucune erreur dans cet intervalle.

    Afin d'avoir plus d'informations sur le traitement des erreurs, tu peux regarder ici
    Consultant et formateur Oracle

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Il y a aussi une autre possibilité qui consiste à ne pas donner le droit de supprimer dans la table aux utilisateurs de l'application mais cette solution qui est plus simple est moins blindée dans la mesure où certains utilisateurs privilégiés pourraient supprimer des lignes de cette table ...
    Consultant et formateur Oracle

  14. #14
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je vais devoir créer des rôles et donner tel ou tel droit, c'est cela ?

  15. #15
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Voir aussi la FAQ à ce sujet ou éventuellement passer à Oracle 11 et utiliser la fonctionnalité de table en lecture seule.

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

Discussions similaires

  1. Verrouiller une table
    Par zax-tfh dans le forum Entity Framework
    Réponses: 12
    Dernier message: 01/06/2011, 17h33
  2. Verrouiller une table en lecture ecriture
    Par ullgom dans le forum Access
    Réponses: 1
    Dernier message: 18/12/2006, 16h16
  3. [SQL Server 2000] Verrouiller une table
    Par Matth_S dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/10/2006, 14h34
  4. verrouiller une table
    Par tamerlan dans le forum Access
    Réponses: 4
    Dernier message: 09/05/2006, 16h11
  5. Savoir qui verrouille une table ?
    Par infosorome dans le forum Access
    Réponses: 4
    Dernier message: 20/12/2005, 01h28

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