dil: (Default)
dil ([personal profile] dil) wrote2005-11-08 06:11 pm
Entry tags:

Ещё немножко, и я с этим вашим ораклом совсем свихнусь

У sequence нельзя сбросить START WITH. Зато можно удалить sequence совсем и создать заново.
Но при удалении отваливаются триггеры, которые использовали этот sequence.
Поэтому после создания sequence надо не забыть перекомпилировать триггер.
Вот такая загогулина, панимаишь..

[identity profile] grid123.livejournal.com 2005-11-08 06:21 pm (UTC)(link)
А еще после рестора базы или миграции Oracle продвигает все сиквенсы на некоторое значение. Это помогает в том случае, если объявились некоторые внешние объекты с номерами из оракловых сиквенсов, а онлайновые логи таки не удалось подтыкнуть.

[identity profile] dil.livejournal.com 2005-11-08 10:04 pm (UTC)(link)
Я за него очень рад, но у меня как раз задача была обратная - стереть из базы всё содержимое и впихнуть туда руками одну запись, но с фиксированным идентификатором 1. А он вот все время триггером из сиквенса вынимается..

[identity profile] mastre.livejournal.com 2005-11-09 06:07 am (UTC)(link)
disable trigger - впихнуть запись- enable trigger ?

[identity profile] dil.livejournal.com 2005-11-09 09:58 am (UTC)(link)
И шоб потом этот триггер продолжал увеличивать номера от впихнутой записи, а не от прошлой инкарнации базы..

[identity profile] mastre.livejournal.com 2005-11-09 11:35 am (UTC)(link)
так то оно так, но насколько я понял идею разработчиков, sequence используется для получения уникальных записей, а не последовательных. поэтому так и сделали -- не все ли равно какой PK будет 1 или 4378.
есть утилки, например pl/sql developer позволяет одним кликом мыши сделать recompile referencing objects.
вот обидно было когда (в 8.0 по крайней мере) при create or replace view убивались все instead of триггеры на эту view, и упоминания о такой фиче я в доках не нашел...

[identity profile] grid123.livejournal.com 2005-11-09 10:53 am (UTC)(link)
В таком случае триггер нужно писать так

BEGIN
IF :new.id IS NULL OR :new.id = 0 THEN
SELECT SEQUENCE_NAME.nextval INTO foo FROM dual;
:new.id := foo;
END IF;
END;

тогда сиквенс будет генерироваться только в том случае, когда значение первичного ключа
отсутствует либо равно 0.

В Infomix-е для автоинкрементируемых полей такое поведение было по-умолчанию.

[identity profile] dil.livejournal.com 2005-11-09 11:03 am (UTC)(link)
Ага, спасибо за идею, учту.
Только это все равно не спасает от проблемы со сбросом счетчика в начальное состояние. Хотя оно, на самом деле, особо и не нужно..

[identity profile] cybernatic-cat.livejournal.com 2005-11-08 06:39 pm (UTC)(link)
А ты думал, что в сказку попал? ;))

[identity profile] duke-igthorn.livejournal.com 2005-11-08 07:47 pm (UTC)(link)
"А шоб знал!" (с) ;)