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