2017-05-10 5 views
0

Wir migrieren unser System von Oracle 11g auf 12C, mein Szenario betrifft nur Tests, wenn wir live gehen, werden wir die Anwendung pausieren, damit keine weiteren Sequenzen generiert werden. Ich bin auch neu in Oracle.Sequenzen in 12C neu erstellen

In unserer Testumgebung bekommen wir aufgrund der Folgenummern wichtige Verletzungen.

Ich muss 343 bestehende Sequenzen durchlaufen, die höchste Nummer bekommen und Sequenzen neu erstellen/neu erstellen, beginnend mit der aktuellen höchsten Nummer +1 in jeder Tabelle. Der Code unten (von einem anderen Thread) funktioniert möglicherweise, aber ich brauche es, um durch 343 Tabellen zu gehen. Abrufen der maximalen Sequenznummer aus user_sequences in 11g;

 declare 
     ex number; 
    begin 
     select MAX(MAX_FK_ID) + 1 into ex from TABLE; 
     If ex > 0 then 
     begin 
       execute immediate 'DROP SEQUENCE SQ_NAME'; 
      exception when others then 
      null; 
     end; 
     execute immediate 'CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START 
     WITH ' || ex || ' NOCYCLE CACHE 20 NOORDER'; 
     end if; 
    end; 
+1

Mögliches Duplikat von [Die beste Methode, um eine Oracle-Sequenz auf den nächsten Wert in einer vorhandenen Spalte zurückzusetzen?] (Http://stackoverflow.com/questions/6099108/best-way-to-reset-an-oracle-sequence) -zum-nächsten-Wert-in-einer-bestehenden-Spalte) – OldProgrammer

+0

Um Ihre Frage möglicherweise neu zu formulieren, befinden Sie sich in einer Testumgebung und Sie haben gerade neue Daten aus der Produktion geladen und Ihre Sequenzen sind nun in der Testumgebung Hinter den Schlüsselwerten in den Daten müssen Sie also die Testumgebungssequenzen hochsetzen, damit sie Werte oberhalb der gerade geladenen Daten generieren.(Wütend). Folgen Sie dem Link @OldProgrammer zur Verfügung gestellt, wie es den Weg zeigt, und Sie sollten in der Lage sein, alle Ihre Sequenz programmgesteuert zu machen. – unleashed

Antwort

0

Wenn Sie Ihre Daten exportieren, wenn die Anwendung Quiescemodus, dann Ihre Daten in 12c importieren sollten Sie nicht Schlüsselfragen haben.

Wenn Upgrade 12c vorhanden ist, sollten Sie auch keine Schlüsselprobleme haben.

Ich war an Dutzenden von 12c-Migrationen beteiligt und habe noch nie von diesem Problem gehört.

1

Hier hilft eine anständige Namenskonvention/Norm.

In Datenbanken, die ich entworfen habe, hat jede Tabelle einen 3 oder 4 Zeichen Alias, und wir nennen Dinge wie Indizes, Einschränkungen usw. mit diesem Alias.

Wenn eine Tabelle namens the_table einen Alias ​​ttab hat, wäre die Primärschlüsselspalte ttab_id, die Primärschlüsseleinschränkung wäre pk_ttab und die Sequenz, die für ttab_id verwendet wird, wäre seq_ttab_id.

Vor diesem Hintergrund würden Sie jemanden wie die folgende (nicht getestet, so könnte ein wenig angepasst werden müssen, aber hoffentlich sollten Sie die allgemeine Idee) schreiben:

DECLARE 
    CURSOR cseq IS 
     SELECT sequence_name seqname FROM user_sequences; 
    tabname VARCHAR2(30); 
    colname VARCHAR2(30); 
    cmd  VARCHAR2(1000); 
    maxval NUMBER; 
BEGIN 
    FOR r IN cseq LOOP 
     /* 
     ** Now get corresponding table/column name matching the sequence name 
     */ 
     SELECT table_name, column_name 
     INTO tabname, colname 
     FROM user_cons_columns # 
     WHERE column_name = REPLACE (r.seqname, 'SEQ_', '') 
     AND constraint_name = REPLACE(REPLACE(r.seqname, '_ID', ''), 'SEQ_', 'PK_'); 
     /* 
     ** Query the table to get the current maximum value - could use stats 
     */ 
     cmd := 'SELECT MAX(' || colname || ') FROM ' || tabname; 
     EXECUTE IMMEDIATE cmd INTO maxval; 
     /* 
     ** Set sequence to inc by that amount 
     */ 
     cmd := 'alter sequence ' || r.seqname || ' INCREMENT BY ' || maxval; 
     EXECUTE IMMEDIATE cmd; 
     /* 
     ** SELECT the sequence to bump its value up 
     */ 
     cmd := 'SELECT ' || r.seqname || '.nextval FROM DUAL'; 
     EXECUTE IMMEDIATE cmd INTO maxval; 
     /* 
     ** Set sequence inc by back down 
     */ 
     cmd := 'alter sequence ' || r.seqname || ' INCREMENT BY 1'; 
     EXECUTE IMMEDIATE cmd; 
    END LOOP; 
END; 
/

Wenn Sie jedoch die nicht haben Bequemlichkeit der verwendbaren Namenskonventionen, Sie können dies tun:

  • eine gespeicherte Prozedur erstellen, die einen Sequenznamen, Tabellennamen akzeptiert, Spaltennamen als Parameter.
  • Das Verfahren wird die angegebene Tabelle/Spalte für max Wert
  • Das Verfahren wird dann noch gesehen Abfrage der Zuwachs durch Anpassungen über
  • nun einen Wrapper gespeicherte Prozedur generiert, die der Arbeiter Prozedur vorbei in den drei Werten nennen.

End Ergebnis sollte sein:

BEGIN 
    reset_seq_val ('seq1', 'table1', 'col1'); 
    reset_seq_val ('seq2', 'table2', 'col2'); 
... 
END; 

Die hier harte Arbeit wird diese Liste kompilieren, aber einmal erledigt, sollten Sie wiederverwenden es On-Demand können.