IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Gestion de l'auto-incrément après une migration


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut Gestion de l'auto-incrément après une migration
    Bonjour tout le monde,

    J'ai migré une base SQL Server 2005 en Oracle à l'aide de l'outil Oracle SQL Developer. Lors de cette migration, cet outil nous fournit un script à exécuter.
    Avant de l'exécuter, je modifie ce script afin que ma base de données gère l'auto-incrément, le DELETE et l'UPDATE CASCADE.
    Ensuite, j'importe les données et la migration est effectuée.

    Cependant, j'ai un problème, lors de la migration des données, les séquences qui gèrent l'auto-incrément ne sont pas mises à jour. Donc lorsque je vais insérer une donnée, ça va commencer à 1 or j'ai déjà des données dans ma table.
    Cela entraîne donc une violation de contrainte.

    Comment puis-je faire pour que ma séquence commence au nombre approprié et non pas à 1 ?

    Je vous remercie par avance pour vos suggestions.

    J'espère être assez clair

  2. #2
    Invité
    Invité(e)
    Par défaut
    je ne connais pas de méthode miracle.
    Le mieux c'est de rechercher les Max pour l'affecter à la séquence.
    Et pour ça, il est souhaitable qu'il y ait une correspondance assez évidente entre le nom de la séquence et le nom de champ, sinon... Galère !

  3. #3
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    En principe le nom des séquence est constitué comme ceci :
    "nomTable"_"nomchamp"_seq
    Excepté lorsque le nom dépasse les 30 caractères

    Étant donné que je retouche pas mal le script avant de l'exécuter, je peux faire ce que je veux avec le nom de la séquence donc cela n'est pas un souci.

    Le mieux c'est de rechercher les Max pour l'affecter à la séquence.
    Pouvez-vous m'expliquer ceci un peu plus précisément s'il vous plait ?

  4. #4
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Voilà la solution que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    declare
    varmax number;
    varnumber number := 0;
    begin
    SELECT max("nom_clef_primaire") INTO varmaxm FROM "nom_table";
    while (varnumber < varmaxm ) loop
    SELECT "nom_sequence".NEXTVAL INTO varnumber FROM dual;
    end loop;
    end;
    /
    Je crois qu'il y a une meilleure solution en changeant l'incrément mais je n'y arrive pas :s

    Tous les noms de séquences sont formés comme ceci : "nom_clef_primaire"_"nom_table"_seq

    est-il possible de parcourir toutes les séquences au lieu de créer un script pl/sql par séquence ?

    ----------------------------------

    J'essaye de mettre en place une autre solution qui serait mieux adaptée je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Declare
    varmax integer;
    req1 varchar(256);
    req2 varchar(256);
    begin
    select max(id_produit) into varmax from t1_produit;
    varmax:= varmax-2;
    req1:='alter sequence T1_PRODUIT_ID_PRODUIT_SEQ increment by ' || varmax || ';';
    req2:='alter sequence T1_PRODUIT_ID_PRODUIT_SEQ increment by 1;';
    execute immediate req1;
    execute immediate req2;
    end;
    /
    Toutes mes séquences sont à 1 au début donc je pense que cette solution marcherait.
    Cependant, j'ai du faire des erreurs de syntaxe car cela ne marche pas

    Rapport d'erreur :
    ORA-00911: caractère non valide
    ORA-06512: à ligne 10
    00911. 00000 - "invalid character"
    *Cause: identifiers may not start with any ASCII character other than
    letters and numbers. $#_ are also allowed after the first
    character. Identifiers enclosed by doublequotes may contain
    any character other than a doublequote. Alternative quotes
    (q'#...#') cannot use spaces, tabs, or carriage returns as
    delimiters. For all other contexts, consult the SQL Language
    Reference Manual.
    Il doit me manquer un caractère spécial mais lequel



    edit : Le forum PL/SQL me semble plus approprié -> Nouveau post

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  2. Réponses: 5
    Dernier message: 09/03/2007, 19h39
  3. Changer le code apres une migration HF ->mysql
    Par phebus29 dans le forum WinDev
    Réponses: 1
    Dernier message: 23/06/2006, 19h20
  4. Champs virtuel auto incrémenté dans une vue
    Par berceker united dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2006, 14h33
  5. Réponses: 3
    Dernier message: 27/11/2005, 20h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo