Про сиквенсы

igor2222
Дата: 04.10.2004 13:52:33
Как правильно написать скрипт переприсвоения сиквенсу текущего значения?
Т.е. есть таблица, у которой есть примари и она частично заполнена.
Примари генерился методом max(id)+1.
Я создаю триггер, который на бефоре инсерт должен вставлять значение из сиквенса. При этом новый ID должен быть равен max(id)+1 в существующей таблице.
Скрипт юзер должен выполнить один раз из плюса. Т.е. сначала крит сиквенса, потом крит юзера, а потом переприсвоить
alter sequence SEC_USER increment by ? nocache;
mity
Дата: 04.10.2004 14:02:28
а в чем трабла-то? создаешь тригер, создаешь сикв., типа
create sequence t_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with "твое max(id)+1"
increment by 1
nocache;
грохаешь старую логику формирования ключа
и поехали работать дальше
igor2222
Дата: 04.10.2004 14:07:27
Я понял
Как правильно написать
Вот так не катит:
create sequence SEC_USERS
minvalue 1
maxvalue 9999999999999999999999999999
start with (select max(t.u_id)+1 from users t)
increment by 1
nocache;
John.D
Дата: 04.10.2004 14:10:52
Изменить текущее значени СУЩЕСТВУЮЩЕЙ последовательности:

set pages...
...
spool seq.sql
select 'alter sequence ... increment by '||b.max_id - a.last_number||';'
from sys.all_sequences a, (select max(id) max_id from ... ) b;
spool off
@seq.sql
select ....nextval from dual;
alter sequence ... increment by 1;


User должен иметь право изменять эту последовательность.
Параметры SET задайте сами.
Я люблю давать эту задачу студентам и испытуемым.
igor2222
Дата: 04.10.2004 14:43:37
Спасибо. Правда я так понял нужно было в Where еще имя сиквенса прицепить. Вопрос только а что делать если на sys.all_sequences привелегий нет...
Stax
Дата: 04.10.2004 15:06:28
Да, стодентам не позавидуеш
SQL> drop sequence s;
Sequence dropped.

SQL> create sequence s;
Sequence created.

SQL> select s.nextval from dual;
  NEXTVAL
---------
        1

SQL> select max(x) from pivot;
   MAX(X)
---------
      999


SQL> select last_number from user_sequences where SEQUENCE_NAME='S';
LAST_NUMBER
-----------
         21

SQL> select 999-21 from dual;
   999-21
---------
      978

SQL> alter sequence s increment by 978;
Sequence altered.

SQL> select s.nextval from dual;
  NEXTVAL
---------
      979

SQL> alter sequence s increment by 1;
Sequence altered.

SQL> select s.nextval from dual;

  NEXTVAL
---------
      980

А должно быть, 999 или 1000
ет, как договорится

igor2222
Дата: 04.10.2004 16:15:10
автор
А должно быть, 999 или 1000
ет, как договорится

Что то я логики не понял. Откуда вообще берется
автор
SQL> select last_number from user_sequences where SEQUENCE_NAME='S';
LAST_NUMBER
-----------
21
_kain_
Дата: 04.10.2004 16:18:29
John.D
set pages...
...
spool seq.sql
select 'alter sequence ... increment by '||b.max_id - a.last_number||';'
from sys.all_sequences a, (select max(id) max_id from ... ) b;
spool off
@seq.sql
select ....nextval from dual;
alter sequence ... increment by 1;

Тогда уж предыдущее значение increment by сохраняли бы, что-ли.
  • А если этот скрипт 2 пользователя запустили одновременно? Это только у студентов базы однопользовательские
  • Требует больше прав, чем банальное select ....nextval from dual
  • Будет работать как планируется только если
    1) Cache = 1 (см у Stax)
    2) Никто сиквенс не использует.
  • igor2222
    Дата: 04.10.2004 16:30:29
    Народ, хватит критиковать. Насчет однопользовательского режима- изначально задача так и ставилась. Предложите лучше альтернативу. Написать select
    'alter sequence sec_users increment by '||to_char(max_id - Sec_users.NextVal)||';'
    from (select max(u_id) max_id from users) b
    where a.sequence_name='SEC_USERS'; что ли?
    Дк опять таки select max(u_id) всплівает....
    Stax
    Дата: 04.10.2004 16:44:47
    2 igor2222
    Эт не Вам писал, просто написал что екзамин бы не сдал

    Вот здесь

    select my_sequence.nextval into X from dual;
    alter sequence my_sequence increment by (Y-X);
    select my_sequence.nextval into X from dual; -- имеем тот самый Y :-)
    alter sequence my_sequence increment by 1;


    Плюс запомнить increment by и восстановить

    автор
    Что то я логики не понял. Откуда вообще берется

    Тут зависит что надо получить
    1 nextval вернет max(id)
    2 nextval вернет max(id)+1 (что более вероятно)

    Вот такая лоргика,
    что именно нужно Вам не знаю п1 или п2