|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 2 ![]() |
Bonjour,
Lorsque j'exécute le script suivant (tout bête !), j'obtiens comme chiffre pour mes n° de membre 2 et 3, alors que je devrais obtenir 1 puis 2. J'ai ce problème sous 11g et 11gR2, mais par contre, cela fonctionnait très bien sous 10g. Quelqu'un a-t-il une idée ? Merci. Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Bonjour,
http://download.oracle.com/docs/cd/B...ments_6015.htm Quand tu créés une séquence la première valeur par défaut est 1. Dans ton premier insert on a soit 2.
__________________
Cordialement. |
|
|
01
|
|
|
#3 | ||||||
![]() Inscription : décembre 2002 Messages : 2 387 ![]() |
En effet, c'est un problème réel et répertorié, effet secondaire désagréable de la création de segment différée. Ce mécanisme permet de créer une table sans allouer d'espace (c'est à dire sans créer de segment) tant qu'on n'insère pas au moins une ligne.
Ce problème troublant survient lorsque les conditions suivantes sont cumulées : - Oracle 11gR2 - édition Entreprise - deferred_segment_creation=true - table vide - séquence non initialisée (encore jamais appelée) - schéma autre que SYS ou SYSTEM Dans ces conditions, lorsque vous insérez la première ligne de la table tout en faisant appel à une séquence "toute neuve", celle-ci subit une double incrémentation. A la ligne 39 de cet exemple, on voit que la séquence, appelée pour la première fois, renvoie 2 au lieu de 1. Code :
Pour éviter tout souci, il faut désactiver la création de segment différée. Cela peut se faire au niveau de la table par exemple : Code :
Code :
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
||||||
|
|
30
|
|
|
#4 | ||
|
Membre éclairé
![]() |
pourquoi ne pas créer cette sequence comme:
Code :
|
||
|
|
02
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
|
|
|
|
00
|
|
|
#6 |
![]() ![]() |
C'est vrai que le bug est surprenant et je n'irai pas dire que c'est un comportement normal, mais ce n'est pas plus grave qu'un "trou" créé suite à un rollback.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 |
![]() Inscription : décembre 2002 Messages : 2 387 ![]() |
Sur ce coup-là, ils sont franchement de mauvaise foi chez Oracle.
La création de segment différée provoque une petite régression qui leur avait échappé, ils feraient mieux de corriger leur code pour que les choses continuent à fonctionner comme avant, plutôt que de trouver un prétexte digne du pire des politiciens pour justifier cette anomalie. Une séquence n'a pas à fournir des valeurs prévisibles ? A quoi sert d'avoir une clause START WITH alors ? A quoi sert de préciser INCREMENT BY ? Oracle est déjà un produit assez compliqué comme ça avec ses exceptions de comportement dans tous les sens, sans avoir besoin d'en rajouter...
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Cher Pomalaix,
Vous avez sans aucun doute raison. Mais, je pense également que l’utilisation correcte d’une séquence n’impose en rien la présence obligatoire d’une valeur bien précisée comme 1 dans ce cas. Donc ce n’est pas joli mais ce n’est pas grave non plus. De plus ça va faire une « bonne question d’expert » Le paramétrage de base est … Je crée une séquence comme suit … Je l’utilise comme suit … Quelle est la valeur insérée dans la table : 1 ou 2 ? |
|
|
00
|
|
|
#9 |
![]() Inscription : décembre 2002 Messages : 2 387 ![]() |
Si c'est plus grave, car ça change le comportement qu'on connaissait jusque là. Une séquence est censée fournir des numéros à partir du START WITH, en respectant INCREMENT BY, et ce
sans trou sous réserve qu'on ne fasse pas de ROLLBACK ou que l'instance ne soit pas redémarrée. Je connais plus d'un script d'initialisation d'environnement basé sur ces hypothèses. Si on a dit START WITH 1, ils s'attendent à trouver 1 comme première valeur. J'avais concrètement rencontré ce cas en début d'année dernière, où ce décalage initial de la séquence fichait en l'air la validité des clés étrangères. Alors bien sûr, on peut objecter que ces scripts étaient critiquables, mais le fait est que ce qui marchait avant ne marchait plus, et ce sans raison valable.
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
00
|
|
|
#10 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
|
|
|
|
00
|
|
|
#11 |
![]() Inscription : décembre 2002 Messages : 2 387 ![]() |
Arf, j'aurais parié ma paye que tu rebondirais là-dessus
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
|
|
|
00
|
|
|
#13 | ||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 2 ![]() |
Bonjour,
Merci beaucoup à Pomalaix pour la réponse. Je trouve également qu'il s'agit d'un bug. D'autant plus que si je supprime les données de la table puis si je supprime la vue et la recréé, le nombre démarre bien à un (et non à 2) ! J'ajoute que le code suivant ne change rien à l'erreur : Code :
Merci. |
||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Pomalaix l'a montré en 1ere ligne de sa démo :
DEFERRED_SEGMENT_CREATION |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
Pour en rajouter un peu, je dirais que l'erreur de départ, c'est d'avoir fait des sequences qui 1) s'appellent sequences 2) donnent un NUMBER On aurait un 'generator' qui donnerait seulement un RAW en garantissant seulement de ne pas tomber 2 fois sur le même, et personne ne se plaindrait des trous Codialement, 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 ...
|
|
10
|
|
|
#16 |
![]() ![]() |
Comme un sys_guid() ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#17 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Sauf qu'il ferait moins de 16 bytes, et qu'il n'irait qu'en s'incrémentant pour optimiser les index.
__________________
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 ...
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Mais non c’est pire que ça : la machine s’en fout de trous c’est l’humain qu’en a besoin, en gros pour faire comme avant… !
|
|
|
00
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 926 ![]() |
1) les séquences
c'est une bizarrerie Oracle qui remplace mal une colonne "auto-increment" dans MS Access. c'est en général beaucoup plus rapide que toute autre soluce sys_guid ou autre 2) deferred segment creation plein d'effets secondaires et de trucs non testés. L'éternelle complainte des dbas lorsqu'on bousille leurs scripts http://laurentschneider.com/wordpres..._segments.html |
|
10
|
|
|
#20 | |
![]() Inscription : décembre 2002 Messages : 2 387 ![]() |
Citation:
J'aurais bien vu une colonne supplémentaire DEFERRED=YES/NO dans DBA_SEGMENTS, mais il est probable qu'il aurait fallu quand même modifier ses scripts pour traiter les autres colonnes ayant une valeur bizarre, quand le segment n'est pas matérialisé.
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com