|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() |
Bonjour à tous.
Je voudrais savoir s'il existe un sorte de verrou qui permet d'interdire même la consultation d'une table via select. Merci d'avance. |
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : août 2005 Messages : 68 ![]() |
Peux-tu préciser le contexte ?
Il s'agit d'empêcher le select sur une table de manière permanente ou temporaire ? A qui ? |
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() |
Il s'agit d'un verrou temporaire. Je voudrais bloquer l'accès à une table (pour tout le monde sauf l'utilisateur courant) pendant l'execution d'une requête et ensuite la libérer quand la reqête sera terminée.
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Il n'y a pas de moyen simple d'empêcher des SELECT sur une table avec Oracle car par défaut le SELECT (sans clause FOR UPDATE) ne verrouille aucune ligne dans une table. L'instruction LOCK TABLE n'empêche pas les SELECT concurrents.
Pourquoi voulez-vous interdire des SELECT concurrents sur une table ? |
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() |
Citation:
Ensuite on attribue ce lot à l'utilisateur qui a fait le SELECT. Le problème est que si deux utilisateurs effectuent des SELECT en même temps le lot va paraître libre aussi bien pour l'un que pour l'autre, et cela pourra causer des désordres. |
|
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : septembre 2005 Messages : 94 ![]() |
gérer avec un système SELECT FOR UPDATE...s'il ne marche pas pour l'utilisateur lambda c'est qu'un premier est en train de le lire..
2 lecteurs en meme temps? nécéssairement un des 2 passera avant l'autre (au timestamp près) si le select marche, on peut dire qu'il est pdeudo-libre.. quand la sélection (ou pas) est fait ...oracle libère la ligne avec commit ou rollback ça pourrait pas marcher? |
|
|
00
|
|
|
#7 |
|
Membre actif
![]() Inscription : août 2007 Messages : 176 ![]() |
tu peux utiliser l'option NOWAIT du select for update. Mais il faut que tous les select qui accèdent à ton slot et qui sont susceptible de se l'approprier fasse de même.
Ensuite, il faut juste gérer l'exception pour passer sur le slot suivant par exemple |
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() |
Merci pour vos réponses, je vais essayer et je vous dirai la suite.
|
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() |
SELECT ... FOR UPDATE empèche les modifications pour les autres utilisateurs mais ne les empèche pas de voir le contenu de la table. Or ce que je veux c'est justement de les empecher de consulter le contenu de la table.
|
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Non, vous ne voulez pas empêcher les utilisateurs de lire les données mais vous voulez les empêcher de mettre à jour la même donnée en même temps: le SELECT FOR UPDATE est la bonne solution à condition que tout le code applicatif qui va mettre à jour la donnée en question utilise cette clause.
|
|
|
00
|
|
|
#11 |
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Salut,
Tu peux cacher les données avec la sécurité granulaire. |
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Le problème sous-jacent est sans doute celui du "lost update". Voir la longue discussion en anglais à ce sujet sur AskTom et en particulier comment Forms traite ce cas.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com