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?