Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/01/2008, 22h56   #1
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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 :
1
2
 
LOCK TABLE <nomTable> ???
Merci.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h00   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

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

Quel est le besoin?
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h05   #3
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h22   #4
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h31   #5
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
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.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h45   #6
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
En gros le core du trigger devrait ressembler à ça
Code :
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.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 23h58   #7
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Donc il faut que je fasse un TRIGGER dans lequel je lève une exception?

Code :
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 ?
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 00h02   #8
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 00h14   #9
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Merci beaucoup, donc on obtient cela
Code :
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?
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 00h43   #10
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Oui c'est bien ça ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 00h46   #11
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Merci beaucoup, mais désolé d'insister, est-ce que -20001 correspond à une erreur particulière?
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 00h54   #12
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 01h01   #13
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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 ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 01h31   #14
Membre habitué
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 450
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 450
Points : 131
Points : 131
Je vais devoir créer des rôles et donner tel ou tel droit, c'est cela ?
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 08h21   #15
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Voir aussi la FAQ à ce sujet ou éventuellement passer à Oracle 11 et utiliser la fonctionnalité de table en lecture seule.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h50.


 
 
 
 
Partenaires

Hébergement Web