|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() |
Bonjour,
Quelqu'un pourrait m'en dire plus sur les triggers... J'ai voulu faire quelques chose mais apparemment ce n'est pas possible, je pense que c'est dû à une méconnaissance des principes sur les triggers. j'expose mon cas : En théorie, je voulais donc changer un champs sur le déclenchement de mon trigger avec ":new", sur le "befor update", jusque la pas de problème. Ensuite, je voulais utiliser le "after update" sur le même trigger pour lire la table mais je ne peux pas : "table en mutation"... D'ou ma question : pourquoi un AFTER update, si la table est toujours en modification, pourquoi a ce moment la le commit n'as pas été fait. Question bonus : j'ai essayé de forcer le commit avec des transaction autonome dans le trigger, mais même avec ça, quand je lis la même table dans le trigger avec un autre transaction autonome, je ne voie la table qu'a sont stade n-1.
__________________
modérateur webmasters - développements web & php faq jQuery - règles du forum - faqs web mon espace persoVenez participez au deuxième defi Web !
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Prenez le temps de lire "Triggers considered harmful, considered harmful" c'est assez bien expliqué.
|
|
|
10
|
|
|
#3 | ||
|
Membre éclairé
![]() ![]() Inscription : janvier 2005 Messages : 309 ![]() |
/*
Ensuite, je voulais utiliser le "after update" sur le même trigger pour lire la table mais je ne peux pas : "table en mutation"... */ Table en mutation c'est par en rapport avec AFTER UPDATE, ça provient du fait qu'Oracle interdise l'accès en lecture à la table dans le code du déclencheur. /* D'ou ma question : pourquoi un AFTER update, si la table est toujours en modification, pourquoi a ce moment la le commit n'as pas été fait. */ le déclencheur s'exécute après l'update, le commit n'a rien à voir. D'ailleurs un déclencheur ne doit pas commiter une transaction car ça n'a pas de sens. Tu veux commiter : Code :
passe, sinon tu arrives dans la zone d'exceptions. |
||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Bon, il faut être au clair sur ce que tu veux faire vraiment. Tout dépend si tu fait un des trigger "For Each Row" ou Pas.
Dans le premier cas, tu n'auras pas le droit de lire la table que tu es en train de modifier (car lorsque tu fait une modif globale, le système ne maitrisera pas quelle ligne est modifiée avant quelle autre, et le résultat produit serait totalement aléatoire) Tu as cependant accès à ta seule ligne en modification :new les valeurs d'après, :old les valeurs d'avant. Dans le 2ième cas, tu auras le droit de lire ta table MAIS, tu n'auras pas accès au :new ou :old pour la simple raison que ces termes désignent des lignes, donc pour des modifs globales ça n'a plus de sens. L'idéal serait qu'Oracle fournisse un tableau de ":new" ou de ":old" qui représenterait l'ensemble des lignes modifiées, à l'image de la pseudo table "inserted" de SQL-Server. Malheureusement (et pour des raisons que j'ignore) Oracle n'a jamais daigné fournir ça au développeurs. Il est cependant possible de la constituer soit même cette table en empilant les données par un trigger "for each row" soit dans une table temporaire, soit dans une variable tableau d'un package, puis disposer de cette table dans un 2ième trigger qui lui ne sera pas "for each row" Tout est expliqué ici: http://sgbd.developpez.com/oracle/ora-04091/ |
|
|
00
|
|
|
#5 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Mon cher Christian...
Citation:
Les tables mutantes sont une invention d'Oracle.. Et pas la meilleure (incapacité de mettre à jour à la volée la table du trigger...) Citation:
C'est ce que font SQL Server et ASE... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||
|
11
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Citation:
Citation:
Attention, il ne faut pas perdre de vue la différence fondamentale qu'il y a entre un SGBD comme Oracle qui copie les données avant de les modifier et un autre comme SQL-Server ou Sybase qui lock les données en lecture pendant les modifications. Dans le premier cas, c'est plus compliqué et y'a quelques contraintes, mais ça a l’énorme avantage de n'être quasiment jamais bloqué en lecture. |
||
|
|
20
|
|
|
#7 | |
![]() Inscription : décembre 2002 Messages : 2 389 ![]() |
Citation:
A ce titre, une opération de fin de transaction n'a rien à y faire. De plus, dans un déclencheur FOR EACH ROW, j'ai du mal à imaginer à quoi servirait de mettre un ROLLBACK ou un COMMIT. Une opération unitaire touchant 10 lignes se traduirait par 10 transactions ? Si on veut gérer une contrainte fonctionnelle par déclencheur, alors on utilisera, comme l'a expliqué Christian, le mécanisme des exceptions, qui permettra d'annuler l'instruction déclenchante et les effets du trigger, sans nécessairement annuler la transaction complète.
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
|
10
|
|
|
#8 | |
![]() Inscription : décembre 2002 Messages : 2 389 ![]() |
Citation:
Une transaction autonome, est, comme son nom l'indique, autonome. Comme si elle faisait partie d'une autre session. De ce fait, elle est soumise aux mécanismes d'isolation, à savoir READ COMMITTED par défaut. Autrement dit, une transaction T2 ne peut pas voir les effets d'une autre transaction T1, tant que T1 n'a pas été validée. Or T1 a été mise en suspens pour que T2 s'exécute ; aucun COMMIT n'a eu lieu. T2 n'a donc aucune chance de voir les effets de T1. Conclusion : les transactions autonomes ne sont quasiment jamais une solution valable pour contourner un problème de "table mutante".
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
|
10
|
|
|
#9 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
"Readers do not block writers and writers do not block readers" Ce qui veut dire que l'on n'est jamais bloqué en cas de select et qu'en faisant des selects (pas for update) nous bloquons personne. Ce qui semble t-il n’est pas le cas dans tous les autres SGBD |
|
|
|
10
|
|
|
#10 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Absolument, c'est quelque chose auquel ne pensent pas naturellement les DBA ou les concepteurs ayant l'habitude de travailler avec Oracle. Pour être intervenu parfois sur un gros système appuyé sur Sybase, je tombais des nues à chaque fois que j'étais confronté au problème.
|
|
|
10
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
|
|
|
|
10
|
Copyright © 2000-2012 - www.developpez.com