Очистка последовательностей Oracle - PullRequest
2 голосов
/ 09 февраля 2011

Я много работал с SQL Server, но у меня очень мало опыта работы с Oracle.Мне дали задание «очистить» последовательности в базе данных Oracle, и я не уверен, как это сделать безопасно.

Мне нужно определить максимальное значение на самом деле в таблице (скажем, ID = 105).Затем посмотрите и посмотрите, какова следующая последовательность для этого идентификатора.Если это 106, то все будет хорошо.Если бы это было 110, тогда мне нужно сбросить его обратно на 106.

Могу ли я безопасно отбросить последовательность, затем воссоздать ее или это испортит уже существующий первичный ключ?Я предполагаю, что это не будет проблемой, но прежде чем я взломал чужую систему, я хотел спросить.

Это команда, которую я собираюсь использовать

Drop Sequence blah.foo_seq
Create Sequence blah.foo_seq Start WIth 106 Min 1 Max 2147483647 yada yada

1 Ответ

11 голосов
/ 09 февраля 2011

Как правило, я бы с осторожностью относился к необходимости «очистить» последовательность Oracle. Поскольку последовательности Oracle нельзя использовать для генерации значений без пропусков, если 110 вызовет проблему для приложения, существуют более серьезные проблемы, которые необходимо решить.

Удаление последовательности не влияет на первичный ключ. Но он делает недействительными любые объекты, которые ссылаются на последовательность, и удаляет любые привилегии. Вы можете перекомпилировать код после повторного создания последовательности, поэтому удаление привилегий может быть проблематичным.

Альтернативный подход, который устраняет необходимость иметь дело с потерянными привилегиями, заключается в изменении параметра INCREMENT BY для уменьшения значения последовательности, т.е.

ALTER SEQUENCE foo_seq
  INCREMENT BY -4;

SELECT foo_seq.nextval
  FROM dual;

ALTER SEQUENCE foo_seq
  INCREMENT BY 1;
...