Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak co roku automatycznie resetować wartość sekwencji do 0 w Oracle 10g?

Sekwencje nie są tak naprawdę zaprojektowane do resetowania. Są jednak przypadki, w których zresetowanie sekwencji jest pożądane, na przykład podczas konfigurowania danych testowych lub scalania danych produkcyjnych z powrotem w środowisku testowym. Ten rodzaj aktywności nie zwykle wykonywane w produkcji.

Jeśli tego typu operacja ma zostać wprowadzona do produkcji, musi zostać dokładnie przetestowana. (Najbardziej niepokojące jest to, że procedura resetowania może zostać przypadkowo wykonana w złym czasie, na przykład w połowie roku.

Jednym z podejść jest porzucanie i odtwarzanie sekwencji. Jako operacja jest to dość proste, jeśli chodzi o SEKWENCJĘ:

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

[EDYTUJ] Jak poprawnie wskazuje Matthew Watson, każda instrukcja DDL (taka jak DROP, CREATE, ALTER) spowoduje niejawne zatwierdzenie. [/EDYTUJ]

Ale wszelkie przywileje przyznane w SEKWENCJI zostaną usunięte, więc trzeba będzie je ponownie przyznać. Wszelkie obiekty, które odwołują się do sekwencji, zostaną unieważnione. Aby to uogólnić, musisz zapisać uprawnienia (przed porzuceniem sekwencji), a następnie ponownie je przyznać.

Drugim podejściem jest ZMIANA istniejącej SEKWENCJI, bez porzucania jej i odtwarzania. Resetowanie sekwencji można wykonać zmieniając wartość PRZYROST na wartość ujemną (różnica między bieżącą wartością a 0), a następnie wykonaj dokładnie jeden .NEXTVAL, aby ustawić bieżącą wartość na 0, a następnie zmień PRZYROST z powrotem na 1. Używałem tego samego podejścia wcześniej (ręcznie, w środowisku testowym), aby ustawić sekwencję na większą wartość.

Oczywiście, aby to działało poprawnie, musisz ubezpieczyć się żadne inne sesje nie odwołują się do sekwencji podczas wykonywania tej operacji. Dodatkowa .NEXTVAL w złym momencie zepsuje reset. (UWAGA:osiągnięcie tego po stronie bazy danych będzie trudne, jeśli aplikacja łączy się jako właściciel sekwencji, a nie jako oddzielny użytkownik).

Aby to się działo co roku, musiałbyś zaplanować pracę. Resetowanie sekwencji będzie musiało być skoordynowane z resetowaniem części YYYY twojego identyfikatora.

Oto przykład:

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

[EDYTUJ]

NIETESTOWANE symbol zastępczy dla jednego możliwego projektu bloku PL/SQL do resetowania sekwencji

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

UWAGI:

  • Jak najlepiej zabezpieczyć sekwencję przed dostępem podczas jej resetowania, ZMIEŃ ją?
  • Kilka przypadków testowych do wykonania tutaj.
  • Pierwszy przebieg, sprawdź normatywne przypadki sekwencji dodatniej, rosnącej, z przyrostem 1.
  • czy lepszym podejściem byłoby utworzenie nowej SEKWENCJI, dodanie uprawnień, zmiana nazwy istniejących i nowych sekwencji, a następnie ponowne skompilowanie zależności?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Historia impasów w Oracle?

  2. Jak dołączyć pliki jar do procedury składowanej Java w Oracle?

  3. Oracle ODP.Net z Entity Framework 6 — nie można znaleźć dostawcy zgodnego z bazą danych Entity Framework

  4. Jak porównać wartości liczbowe w tych samych kolumnach dla wielu kolumn za pomocą Oracle SQL?

  5. Zapytanie Oracle, aby dopasować wszystkie wartości na liście wśród wszystkich wierszy w tabeli