sql >> Database teknologi >  >> RDS >> Oracle

Hvordan nulstiller jeg automatisk en sekvenss værdi til 0 hvert år i Oracle 10g?

Sekvenser er ikke rigtig designet til at blive nulstillet. Men der er nogle tilfælde, hvor nulstilling af en sekvens er ønskelig, for eksempel ved opsætning af testdata eller sammenlægning af produktionsdata tilbage i et testmiljø. Denne type aktivitet er ikke normalt udført i produktionen.

HVIS denne type operation skal sættes i produktion, skal den testes grundigt. (Det, der giver størst bekymring, er muligheden for, at nulstillingsproceduren ved et uheld bliver udført på det forkerte tidspunkt, f.eks. midt på året.

At droppe og genskabe sekvensen er én tilgang. Som en operation er det ret ligetil, hvad angår SEKVENSEN:

    DROP SEQUENCE MY_SEQ;
    CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 0;

[EDIT] Som Matthew Watson korrekt påpeger, vil hver DDL-sætning (såsom en DROP, CREATE, ALTER) forårsage en implicit commit. [/EDIT]

Men alle privilegier givet på SEQUENCE vil blive droppet, så de skal tildeles igen. Alle objekter, der refererer til sekvensen, vil blive ugyldige. For at få dette mere generaliseret, skal du gemme privilegier (før du dropper sekvensen) og derefter give dem igen.

En anden tilgang er at ÆNDRE en eksisterende SEKVENS uden at droppe og genskabe den. Nulstilling af sekvensen kan opnås ved at ændre INCREMENT-værdien til en negativ værdi (forskellen mellem den aktuelle værdi og 0), og derefter udføre præcis én .NEXTVAL for at indstille den aktuelle værdi til 0, og derefter ændre INCREMENT tilbage til 1. Jeg har brugt den samme tilgang før (manuelt i et testmiljø) til også at indstille en sekvens til en større værdi.

For at dette skal fungere korrekt, skal du selvfølgelig forsikre ingen andre sessioner refererer til sekvensen, mens denne handling udføres. En ekstra .NEXTVAL på det forkerte tidspunkt vil skrue op for nulstillingen. (BEMÆRK:at opnå det på databasesiden vil være svært, hvis applikationen forbinder som ejer af sekvensen, snarere end som en separat bruger.)

For at få det til at ske hvert år, skal du planlægge et job. Nulstillingen af ​​sekvensen skal koordineres med nulstillingen af ​​YYYY-delen af ​​din identifikator.

Her er et eksempel:

http://www.jaredstill.com/content/reset-sequence.html

[EDIT]

UTESTET pladsholder for et muligt design af en PL/SQL-blok for at nulstille sekvens

    declare
      pragma autonomous_transaction;
      ln_increment       number;
      ln_curr_val        number;
      ln_reset_increment number;
      ln_reset_val       number;
    begin

      -- save the current INCREMENT value for the sequence
      select increment_by
        into ln_increment
        from user_sequences
       where sequence_name = 'MY_SEQ';

      -- determine the increment value required to reset the sequence
      -- from the next fetched value to 0
      select -1 - MY_SEQ.nextval into ln_reset_increment from dual;

      -- fetch the next value (to make it the current value)
      select MY_SEQ.nextval into ln_curr from dual;

      -- change the increment value of the sequence to 
      EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
        || ln_reset_increment ||' minvalue 0';

      -- advance the sequence to set it to 0
      select MY_SEQ.nextval into ln_reset_val from dual;

      -- set increment back to the previous(ly saved) value
      EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
        || ln_increment ;
    end;
    /

BEMÆRK:

  • hvordan man bedst beskytter sekvensen mod adgang, mens den nulstilles, OMDØB den?
  • Flere testsager at arbejde igennem her.
  • Første gang, tjek normative tilfælde af positiv, stigende, trin 1-sekvens.
  • Ville en bedre tilgang være at oprette ny SEQUENCE, tilføje tilladelser, omdøbe eksisterende og nye sekvenser og derefter genkompilere afhængigheder?


  1. MySQL:Udførelse af valg af forespørgsel, og resultathentningstiden stiger med antallet af forbindelser

  2. Brug af ét websted til flere domæner i PHP

  3. hvordan man tilføjer timer og minutter i curdate mysql

  4. Sådan konfigureres kilde-replikering i MySQL