sql >> Database >  >> RDS >> Oracle

Hoe stel ik de waarde van een reeks automatisch elk jaar opnieuw in op 0 in Oracle 10g?

Sequenties zijn niet echt ontworpen om te worden gereset. Maar er zijn gevallen waarin het opnieuw instellen van een sequentie wenselijk is, bijvoorbeeld bij het opzetten van testgegevens of het weer samenvoegen van productiegegevens in een testomgeving. Dit type activiteit is niet normaal gedaan in productie.

ALS dit type operatie in productie gaat, moet het grondig worden getest. (De grootste zorg is de mogelijkheid dat de resetprocedure per ongeluk op het verkeerde moment wordt uitgevoerd, bijvoorbeeld midden in het jaar.

Het laten vallen en opnieuw creëren van de reeks is een benadering. Als bewerking is het vrij eenvoudig voor zover de SEQUENTIE gaat:

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

[EDIT] Zoals Matthew Watson terecht opmerkt, zal elke DDL-instructie (zoals een DROP, CREATE, ALTER) een impliciete commit veroorzaken. [/EDIT]

Maar alle privileges die op de SEQUENCE zijn verleend, worden geschrapt, dus die moeten opnieuw worden verleend. Alle objecten die naar de reeks verwijzen, worden ongeldig verklaard. Om dit algemener te krijgen, moet u privileges opslaan (voordat u de reeks laat vallen) en ze vervolgens opnieuw toekennen.

Een tweede benadering is om een ​​bestaande SEQUENTIE TE WIJZIGEN, zonder deze te laten vallen en opnieuw te maken. Het resetten van de reeks kan worden bereikt door de INCREMENT-waarde te wijzigen in een negatieve waarde (het verschil tussen de huidige waarde en 0), en dan precies één .NEXTVAL te doen om de huidige waarde in te stellen op 0, en vervolgens de INCREMENT terug te veranderen in 1. Ik heb dezelfde benadering eerder gebruikt (handmatig, in een testomgeving), om ook een reeks op een grotere waarde in te stellen.

Om dit correct te laten werken, moet u natuurlijk verzekeren geen andere sessies verwijzen naar de reeks terwijl deze bewerking wordt uitgevoerd. Een extra .NEXTVAL op het verkeerde moment verpest de reset. (OPMERKING:het zal moeilijk zijn om dat aan de databasekant te bereiken als de toepassing verbinding maakt als de eigenaar van de reeks, in plaats van als een afzonderlijke gebruiker.)

Om het elk jaar te laten gebeuren, moet je een baan plannen. Het opnieuw instellen van de volgorde moet worden gecoördineerd met het opnieuw instellen van het YYYY-gedeelte van uw ID.

Hier is een voorbeeld:

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

[BEWERKEN]

ONGETEST tijdelijke aanduiding voor een mogelijk ontwerp van een PL/SQL-blok om de volgorde te resetten

    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;
    /

OPMERKINGEN:

  • hoe kun je de reeks het beste beschermen tegen toegang terwijl deze wordt gereset, HERnoemen?
  • Verschillende testgevallen om hier door te werken.
  • Eerste doorgang, controleer normatieve gevallen van positieve, oplopende, incrementele 1 reeks.
  • zou een betere aanpak zijn om een ​​nieuwe SEQUENTIE te maken, machtigingen toe te voegen, bestaande en nieuwe reeksen te hernoemen en vervolgens de afhankelijkheden opnieuw te compileren?


  1. Fout bij het parseren van gegevens org.json.JSONException:einde van invoer bij teken 0 van - Android

  2. HikariCP pass Oracle aangepast type

  3. Hiaten opvullen in data die zijn geretourneerd uit database - pure SQL-oplossing mogelijk?

  4. SELECT INTO werkt niet