|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
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. Merci. |
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Malheureusement, ce n'est pas possible toutes les verrous traitent INSERT, UPDATE et DELETE de la même façon ...
Quel est le besoin? |
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
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.
|
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
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 |
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
Citation:
Peux tu m'expliquer s'il te plais. |
|
|
|
00
|
|
|
#6 | ||
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
En gros le core du trigger devrait ressembler à ça
Code :
La capture éventuelle des erreurs par un bloc PL/SQL se fait si le bloc contient la section EXCEPTION. |
||
|
|
00
|
|
|
#7 | ||
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
Donc il faut que je fasse un TRIGGER dans lequel je lève une exception?
Code :
|
||
|
|
00
|
|
|
#8 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
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. |
|
|
00
|
|
|
#9 | ||
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
Merci beaucoup, donc on obtient cela
Code :
|
||
|
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Oui c'est bien ça ...
|
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
Merci beaucoup, mais désolé d'insister, est-ce que -20001 correspond à une erreur particulière?
|
|
|
00
|
|
|
#12 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
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 |
|
|
00
|
|
|
#13 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
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 ...
|
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : avril 2007 Messages : 450 ![]() |
Je vais devoir créer des rôles et donner tel ou tel droit, c'est cela ?
|
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Voir aussi la FAQ à ce sujet ou éventuellement passer à Oracle 11 et utiliser la fonctionnalité de table en lecture seule.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com