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:
https://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?