sql >> Databáze >  >> RDS >> Oracle

Jak mohu každý rok automaticky resetovat hodnotu sekvence na 0 v Oracle 10g?

Sekvence nejsou ve skutečnosti navrženy k resetování. Existují však případy, kdy je resetování sekvence žádoucí, například při nastavování testovacích dat nebo při slučování produkčních dat zpět do testovacího prostředí. Tento typ aktivity není běžně se provádí ve výrobě.

Pokud bude tento typ provozu uveden do výroby, je třeba jej důkladně otestovat. (Největší obavy vyvolává možnost, že proces resetování bude náhodně proveden ve špatnou dobu, například v polovině roku.

Vypuštění a opětovné vytvoření sekvence je jeden přístup. Jako operace je to poměrně jednoduché, pokud jde o SEKVENCI:

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

[EDIT] Jak Matthew Watson správně zdůrazňuje, každý příkaz DDL (jako DROP, CREATE, ALTER) způsobí implicitní potvrzení. [/EDIT]

Všechna oprávnění udělená SEQUENCE však budou zrušena, takže je bude nutné znovu udělit. Všechny objekty, které odkazují na sekvenci, budou zrušeny. Chcete-li to zobecnit, museli byste uložit oprávnění (před zrušením sekvence) a poté je znovu udělit.

Druhým přístupem je ZMĚNIT existující SEKVENCI, aniž byste ji zrušili a znovu vytvořili. Resetování sekvence lze provést změnou hodnoty INCREMENT na zápornou hodnotu (rozdíl mezi aktuální hodnotou a 0) a poté provedením přesně jednoho .NEXTVAL pro nastavení aktuální hodnoty na 0 a poté změnou INCREMENT zpět na 1. Stejný přístup jsem použil již dříve (ručně, v testovacím prostředí), abych také nastavil sekvenci na vyšší hodnotu.

Aby to správně fungovalo, musíte se samozřejmě pojistit během provádění této operace na sekvenci neodkazují žádné jiné relace. Další .NEXTVAL ve špatném okamžiku reset zkazí. (POZNÁMKA:dosažení toho na straně databáze bude obtížné, pokud se aplikace připojuje jako vlastník sekvence, nikoli jako samostatný uživatel.)

Aby se to stalo každý rok, musíte si naplánovat práci. Reset sekvence bude muset být koordinován s resetem části vašeho identifikátoru YYYY.

Zde je příklad:

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

[UPRAVIT]

NEZKOUŠENÉ zástupný symbol pro jeden možný návrh PL/SQL bloku pro resetování sekvence

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

POZNÁMKY:

  • jak nejlépe ochránit sekvenci před přístupem během jejího resetování, PŘEJMENOVAT ji?
  • Několik testovacích případů, které si zde můžete projít.
  • První průchod zkontrolujte normativní případy pozitivní, vzestupné sekvence s přírůstkem 1.
  • Bylo by lepší vytvořit novou SEKVENCI, přidat oprávnění, přejmenovat stávající a nové sekvence a poté znovu zkompilovat závislosti?


  1. Problémy s accept_nested_attributes_for v Rails 5.0.0.beta3, volba -api

  2. MySQL - SELECT AS in WHERE

  3. Nežádoucí zaokrouhlení DateTime na SQL Serveru

  4. Proč MySQL přidává komentář k tabulkám InnoDB?