Последователностите всъщност не са предназначени да бъдат нулирани. Но има някои случаи, в които нулирането на последователност е желателно, например при настройване на тестови данни или сливане на производствени данни обратно в тестова среда. Този тип дейност не обикновено се прави в производството.
АКО този тип операция ще бъде пусната в производство, тя трябва да бъде щателно тествана. (Това, което предизвиква най-голямо безпокойство, е възможността процедурата за нулиране да бъде случайно извършена в неподходящ момент, например в средата на годината.
Отпадането и повторното създаване на последователността е един подход. Като операция, това е доста лесно, що се отнася до ПОСЛЕДОВАТЕЛНОСТТА:
DROP SEQUENCE MY_SEQ;
CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 0;
[EDIT] Както Матю Уотсън правилно отбелязва, всеки DDL оператор (като DROP, CREATE, ALTER) ще предизвика имплицитно ангажиране. [/РЕДАКТИРАНЕ]
Но всички привилегии, предоставени на ПОСЛЕДОВАТЕЛНОСТТА, ще бъдат премахнати, така че ще трябва да бъдат предоставени отново. Всички обекти, които препращат към последователността, ще бъдат невалидни. За да направите това по-обобщено, ще трябва да запазите привилегии (преди да изпуснете последователността) и след това да ги предоставите отново.
Вторият подход е да ПРОМЕНИТЕ съществуваща ПОСЛЕДОВАТЕЛНОСТ, без да я изпускате и създавате отново. Нулирането на последователността може да бъде осъществено чрез промяна на стойността INCREMENT на отрицателна стойност (разликата между текущата стойност и 0) и след това направете точно един .NEXTVAL, за да зададете текущата стойност на 0, и след това промените INCREMENT обратно на 1. Използвал съм същия подход преди (ръчно, в тестова среда), за да задам поредица и на по-голяма стойност.
Разбира се, за да работи коректно, трябва да се застраховате никакви други сесии не препращат към последователността, докато се изпълнява тази операция. Допълнителен .NEXTVAL в грешния момент ще прецака нулирането. (ЗАБЕЛЕЖКА:постигането на това от страна на базата данни ще бъде трудно, ако приложението се свързва като собственик на последователността, а не като отделен потребител.)
За да се случва всяка година, трябва да планирате работа. Нулирането на последователността ще трябва да бъде координирано с нулирането на частта ГГГГ на вашия идентификатор.
Ето един пример:
https://www.jaredstill.com/content/reset-sequence.html
[РЕДАКТИРАНЕ]
НЕТЕСТВАНО контейнер за един възможен дизайн на PL/SQL блок за нулиране на последователност
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;
/
ЗАБЕЛЕЖКИ:
- как най-добре да защитите последователността от достъп, докато се нулира, ПРЕИМЕНУВАТЕ?
- Няколко тестови случая за работа тук.
- Първо преминаване, проверете нормативните случаи на положителна, възходяща, нарастваща 1 последователност.
- по-добър подход ли би бил да се създаде нова ПОСЛЕДОВАТЕЛНОСТ, да се добавят разрешения, да се преименуват съществуващи и нови поредици и след това да се компилират отново зависимости?