|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Bonjour, y a t-il un moyen, sans utiliser de trigger, de réaliser ces contraintes :
1 - les tables en jeu : Code :
Code :
3 - La seconde contrainte : Code :
Est-ce possible sans trigger, via une UDF (fonction utilisateur) ? Du genre : Code :
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 * * * * * |
||||||||
|
00
|
|
|
#2 |
![]() Inscription : décembre 2002 Messages : 2 385 ![]() |
C'est vite vu : ce n'est pas possible :
http://oracle.developpez.com/faq/?page=3-1#check
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
00
|
|
|
#3 | ||||
![]() ![]() |
En évitant les triggers, il faut aller regarder du côté des vues matérialisées (vues indexées en T-SQL) pour suivre ce genre de contrôle.
Pour le second : Code :
Code :
__________________
Email : http://scr.im/waldar |
||||
|
20
|
|
|
#4 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
Quelle que soit la manière de les implémenter, les contraintes qui référencent autre chose que la ligne en cours (c'est à dire qui référencent d'autres tables ou bien d'autres lignes de la même table) posent un gros problème d'isolation des transactions et de lecture concurrente. La plupart du temps, si on veut que ça fonctionne correctement en multi-utilisateurs, c'est à dire sans corrompre les données, on se retrouve à devoir verrouiller toute la table référencée. Et du coup l'appli devient mono-utilisateur. Ici, pour la première contrainte, ce ne peut pas être une contrainte statique: elle peut être vérifiée au moment de l'insert, mais sera violée si par la suite quelqu'un insère une T_COMMANDE_CMD avec une CMD_DATE plus petite. La condition de la contrainte est vraie au moment de l'insert, mais fausse par la suite. Or une contrainte doit être vérifiée tout le temps. Maintenant, si tu veux implémenter la vérification de manière applicative, ou par trigger, c'est souvent impossible de le faire correctement sans vérrouiller toute la table. Par exemple, toujours pour la première contrainte, imaginons qu'une transaction concurrente est en train d'insérer une commande avec une CMD_DATE plus petite que toutes les autres, mais n'a pas encore commité sa transaction. Alors ta transaction lorsqu'elle vérifie CK_CMD_REMISE ne voit pas cette ligne (car pas encore commitée) et peut donc mettre une CMD_REMISE supérieure à la valeur CMD_DATE de la session concurrente. Les 2 sessions pourront faire le commit de leur transaction, mais pourtant la contrainte n'aura jamais été vraie Pour régler ce cas, il faut empêcher tout insert concurrent sur la table en la verrouillant. Plutôt impossible dans la vraie vie où plusieurs utilisateurs travaillent en même temps. La solution contrainte sur vue matérialisée est bonne, même si elle peut être assez coûteuse à chaque DML: elle va vérifier les contraintes au commit. Donc dans l'exemple ci-dessus, ta session pourra faire son insert, puisque elle ne verra pas l'insert concurrent non commité. C'est par contre la session concurrente qui va planter car elle ne pourra commiter un CMD_DATE plus petit que le CMD_REMISE que tu as mis entre temps. Reste à savoir si c'est bien ce que l'on veut: toute sa transaction va planter alors que c'est lui qui avait fait l'insert en premier, et que c'était légal à ce moment là. C'est la même philosophie que le verrou optimiste: on espère que personne ne modifie en même temps, on se plante quelque fois, et dans ce cas on doit tout recommencer, mais ça passe la plupart du temps et ça évite de poser des verrous trop longtemps. Désolé d'avoir été aussi bavard. On voit souvent des applis qui fonctionnent bien avec un seul utilisateur, mais perdent l'intégrité des données dès qu'il y a concurrence d'accés... Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
50
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 925 ![]() |
Perso, même si je trouve les contraintes sur MVIEWS astucieuses, je suis contre pour les deux raisons ci dessous.
Donc TRIGGER ou contraintes applicatives |
|
20
|
Copyright © 2000-2012 - www.developpez.com