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 :

Script de modification de séquences existantes


Sujet :

Administration Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut Script de modification de séquences existantes
    Bonjour,

    je voulais savoir si qq'un avait un script qui permettrait de dropper des sequences existantes appartenant à un user et de les recréer en modifiant la valeur du startwith de la nouvelle sequence avec le next_val de la sequence existante.
    Si on pouvait faire un ALTER SEQUENCE pour modifier le start with ça serait bien mais on ne peut pas.

    voici un début de script que j'ai élaboré mais il me manque les autres caractéristiques de la séquence:cycle,order etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    declare
     
    	v_sql varchar2(255);
    	v_num_seq number;
     
    begin
     
    	-- boucle sur toutes les sequences
    	for cur_rec in (select * from user_sequences)
    	loop
     
    		-- récup du nextval de la séquence
    		v_sql := 'select ' || cur_rec.sequence_name || '.nextval from dual';
    		execute immediate v_sql into v_num_seq;
     
    		v_sql := 'DROP SEQUENCE ' || cur_rec.sequence_name;
    		execute immediate v_sql;
     
    		v_sql := 'create sequence '|| cur_rec.sequence_name || ' minvalue ' || cur_rec.min_value || ' maxvalue ' || cur_rec.max_value || 
    			' increment by ' || cur_rec.increment_by || ' START WITH ' || v_num_seq;
     
    		execute immediate v_sql;
     
    	end loop;
     
    end;
    /

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    qu'en pensez-vous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    declare
     
    	v_sql varchar2(255);
    	v_num_seq number;
     
    begin
     
    	-- boucle sur toutes les sequences
    	for cur_rec in (select * from user_sequences)
    	loop
     
    		-- récup du nextval de la séquence
    		v_sql := 'select ' || cur_rec.sequence_name || '.nextval from dual';
    		execute immediate v_sql into v_num_seq;
     
    		-- suppression de la sequence
    		v_sql := 'DROP SEQUENCE ' || cur_rec.sequence_name;
    		execute immediate v_sql;
     
    		-- on recréer la même séquence en modifiant juste le start with
    		v_sql := 'create sequence '|| cur_rec.sequence_name || ' minvalue ' || cur_rec.min_value || ' maxvalue ' || cur_rec.max_value || 
    			' increment by ' || cur_rec.increment_by || ' START WITH ' || v_num_seq;
     
    		-- si CYCLE est activé sinon NOCYCLE par defaut
    		IF cur_rec.cycle_flag = 'Y' THEN
    			v_sql := v_sql || ' CYCLE';
    		END IF;
     
    		-- si CACHE = 0 alors NOCACHE si 20 alors valeur par defaut
    		IF cur_rec.cache_size = '0' THEN
    			v_sql := v_sql || ' NOCACHE';
    		ELSE
    			v_sql := v_sql || ' CACHE ' || cur_rec.cache_size;
    		END IF;
     
    		-- si ORDER est activé sinon NOORDER par defaut
    		IF cur_rec.order_flag = 'Y' THEN
    			v_sql := v_sql || ' ORDER';
    		END IF;		
     
    		execute immediate v_sql;
     
    	end loop;
     
    end;
    /
    faut il penser à autre chose?
    les synonymes existant sur ces sequences normalement ne bougent pas ?

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    je voulais savoir si qq'un avait un script qui permettrait de dropper des sequences existantes appartenant à un user et de les recréer en modifiant la valeur du startwith de la nouvelle sequence avec le next_val de la sequence existante.
    Si on pouvait faire un ALTER SEQUENCE pour modifier le start with ça serait bien mais on ne peut pas.
    Bonjour

    Ca donne l'impression de ne servir strictement à rien ! Quel est l'intérêt de la manip ??

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    si ça sert car des sequences ont été recrées sur une base existante avec des valeurs de start with incorrects: certaines valeurs de séquences étaient déjà présentes en base sur des colonnes uniques.

    il me faut recréer les séquences avec les bonnes valeurs pour le start with.

    il me semble que mon script est bon finalement.

    je me demande juste s'il peut y avoir des impacts sur le reste de la base.
    Il est certain que les synonymes sur ces sequences seront invalides; il faudra donc les recompiler.

    cdmt,

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Par défaut
    Pomalaix a raison, ce script ne servira à rien au vu de votre problème de 'start with'.

    Puisque vos séquences sont utilisées pour alimenter certaines colonnes de vos tables, il faut que votre script aille lire les valeurs courantes de ces colonnes pour les utiliser comme valeurs de départ (+1) de vos séquences. Ce qu'on ne voit pas à la lecture de votre script.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    je suis trop bête!!!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    il faut en fait que je récupère les valeurs des sequences de la base prod.
    comment modifier le script pour qu'il me génère un script à partir d'une base de prod pour que je puisse l'executer sur la base de test

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Par défaut
    Si vos séquences en base de prod sont correctes, alors vous pouvez utiliser votre script pour produire les commandes que vous allez lancer en environnement de test. Donc au lieu de faire des execute immediate, utilisez dbms_output.put_line pour générer un fichier à utiliser en test.

    Seul bémol toutefois, vos valeurs en base de test ne doivent pas avoir dépassées celles en prod. Rien n'est moins sûr car des batteries de tests peuvent parfois modifier sérieusement les données en base. Vérifiez cela avant de lancer votre script, autrement vous êtez bon pour rechercher le max des valeurs de chaque colonne associée à vos séquences.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    ce script marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    set serveroutput on
    spool maj_sequences_genere.sql
     
    declare
     
    	v_sql varchar2(255);
    	v_num_seq number;
     
    begin
     
    	-- boucle sur toutes les sequences
    	for cur_rec in (select * from user_sequences)
    	loop
     
    		-- récup du nextval de la séquence
    		v_sql := 'select ' || cur_rec.sequence_name || '.nextval from dual';
    		execute immediate v_sql into v_num_seq;
     
    		-- suppression de la sequence
    		v_sql := 'DROP SEQUENCE ' || cur_rec.sequence_name || ';';
    		dbms_output.put_line(v_sql);
     
    		-- on recréer la même séquence en modifiant juste le start with
    		v_sql := 'create sequence '|| cur_rec.sequence_name || ' minvalue ' || cur_rec.min_value || ' maxvalue ' || cur_rec.max_value || 
    			' increment by ' || cur_rec.increment_by || ' START WITH ' || v_num_seq;
     
    		-- si CYCLE est activé sinon NOCYCLE par defaut
    		IF cur_rec.cycle_flag = 'Y' THEN
    			v_sql := v_sql || ' CYCLE';
    		END IF;
     
    		-- si CACHE = 0 alors NOCACHE si 20 alors valeur par defaut
    		IF cur_rec.cache_size = '0' THEN
    			v_sql := v_sql || ' NOCACHE';
    		ELSE
    			v_sql := v_sql || ' CACHE ' || cur_rec.cache_size;
    		END IF;
     
    		-- si ORDER est activé sinon NOORDER par defaut
    		IF cur_rec.order_flag = 'Y' THEN
    			v_sql := v_sql || ' ORDER';
    		END IF;		
     
     
    		dbms_output.put_line(v_sql||';');
     
    		-- on donne les droits en select sur cette sequence
    		v_sql := 'grant select on ' || cur_rec.sequence_name || ' to public;';
    		dbms_output.put_line(v_sql);
     
     
    	end loop;
     
    end;
    /
    set serveroutput off
    par contre à la fin du fichier spoolé j'ai les lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Procédure PL/SQL terminée avec succès.
    SQL> 
    SQL>
    comment faire pour ne pas qu'elles apparaissent ?

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Par défaut
    set feedback off

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    ça marche super.

    par contre j'ai dû aussi rajouter le grant select sur les sequences car si les synonymes restent lors de la suppression des sequences, les privilèges s'en vont.

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

Discussions similaires

  1. Script WISE : modification contenu variable
    Par ghisl1 dans le forum Installation, Déploiement et Sécurité
    Réponses: 0
    Dernier message: 20/06/2008, 12h57
  2. [AJAX] Script inline modification
    Par lelectronique.com dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/03/2008, 19h31
  3. script de modification d'une string dans un champ
    Par cfrancois dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/08/2007, 11h11
  4. Script des modifications effectuées via la console
    Par secdeouf dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/10/2006, 19h28
  5. Scripting de modification de fichier
    Par solp dans le forum Linux
    Réponses: 2
    Dernier message: 21/05/2006, 12h57

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