Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание тригера [D7]


Страницы:   1 2

Scorpio ©   (2006-07-24 13:34:00) 

Добрый день мастера. У меня возникла проблема с тригером.
Как создать тригер ьаким образом, чтобы он проверял сегоднешнюю дату, создавал к ней сиквенцию, + 5 цифр после, и если такая сиквенция уже существует, то к ней + 1.

Ипользую Оракл 10


Petr V. Abramov   (2006-07-25 14:18:00) [1]

> Scorpio ©   (25.07.06 09:52) [35]
> а мне необходимо чтобы она сработала когда надо
 так вот "когда надо" и вызывайте. В триггере. В процедуре, которая формирует документ. примените фантазию, где еще.
 Вы "верной дорогой идете", но все ж прочитайте SQL Reference и Concepts от корки до корки, поверьте на слово, это не будет потраченное зря время.


Scorpio   (2006-07-25 09:52:00) [2]


> :new.DOC_NUM := :new.DOC_NUM||'.'||substr(to_char(:new.DOC_DATE,
>  'DD-MM-YY',8,2))

а дальше, это ж насколько я понял разовая запись, а мне необходимо чтобы она сработала когда надо.


Sergey13   (2006-07-25 08:26:00) [3]

> [32] Scorpio ©   (24.07.06 19:07)
> И все таки, в сиквенции должен присуствовать год, иначе
> неизвесно как настроена дата и время на рабочих станциях
> и у меня начнется сыр бор. Все сервера работают в зеркале,
> тут проблем нет, даата там синхронизирована.
>
>   Мне необходимо все исключить или хотябы большую часть
> человеческого фактора.

Ну и делай все на сервере.


Petr V. Abramov   (2006-07-24 19:23:00) [4]

> Scorpio ©   (24.07.06 19:07) [32]
> Этого я не понял, номер карты создается в момент ее генерации, и никак иначе.
 Это все правильно. Но если карту надо ввести задним/передним числом? А если люди заполночь засиделись?

> И все таки, в сиквенции должен присуствовать год
 (примерно):

:new.DOC_NUM := :new.DOC_NUM||'.'||substr(to_char(:new.DOC_DATE, 'DD-MM-YY',8,2))


Scorpio   (2006-07-24 19:07:00) [5]


> Если в номере присутствует год, то он должен браться от
> даты карты, а не от текущего времени.


Этого я не понял, номер карты создается в момент ее генерации, и никак иначе.

И все таки, в сиквенции должен присуствовать год, иначе неизвесно как настроена дата и время на рабочих станциях и у меня начнется сыр бор. Все сервера работают в зеркале, тут проблем нет, даата там синхронизирована.

   Мне необходимо все исключить или хотябы большую часть человеческого фактора.


Petr V. Abramov   (2006-07-24 18:42:00) [6]

> Scorpio ©   (24.07.06 18:32) [29]
> можно ли как то обнулить сиквенцию один раз в год 1 января в 00:00
 можно, но не нужно. Если в номере присутствует год, то он должен браться от даты карты, а не от текущего времени.


Petr V. Abramov   (2006-07-24 18:40:00) [7]

> Reindeer Moss Eater ©   (24.07.06 18:03) [28]
 Ваше высказывание, мягко говоря, голословно

> Scorpio ©   (24.07.06 17:57) [27]
> какова вероятность того что не будет дубля,
 100%
> при сиквенции, там понятно,
 а тут поле или увеличится на 1, или произойдет откат. Другой желающий получить номер будет ждать своей очереди, пока транзакция не решит, коммтится она или нет.
 Конечно, вызов надо ставить максимально близко к концу транзакции


Scorpio   (2006-07-24 18:32:00) [8]

Тогда такой вопрос, в автоматическом режиме можно ли как то обнулить сиквенцию один раз в год 1 января в 00:00


Reindeer Moss Eater   (2006-07-24 18:03:00) [9]

Процедура эта ничем не лучше сикванса, а скорее даже хуже.
Как по возможным дырам так и по возможным дубликатам.


Scorpio   (2006-07-24 17:57:00) [10]


> create procedure last_num_get(num varchar2 out)
>   x number(38)
> begin
>  update T_LAST_NUM
>    set LAST_NUM = LAST_NUM + 1
>    returning LAST_NUM into x;
>  num := to_char(x)
> end
>


Только вопрос, куда ее толкать, и как потом вызывать, и еще, какова вероятность того что не будет дубля, при сиквенции, там понятно, один номер и все, и там у меня еще ни разу не создавались дырки, пока все заполненные номера были.


Petr V. Abramov   (2006-07-24 15:15:00) [11]

> Desdechado ©   (24.07.06 14:59) [25]
> А от других причин - ставить sequence NOCACHE
 спасет до первого rollback`а

> Но вопрос, конечно же, в "чем дырки помешали"?
 при нумерации серьезных документов часто ТРЕБУЕТСЯ непрерывность. На уровне "так надо", таково ТЗ. Например, с теми же иммиграционными картами - когда карты № 1002 просто нет в природе, соблазн сделать левую за этим номером, а потом сослаться на глюки системы, "была да потерялась в компьютере" сильно повышается.


Desdechado   (2006-07-24 14:59:00) [12]

Иммиграционные карты вряд ли будут удаляться, от этого дырок не будет.
А от других причин - ставить sequence NOCACHE


Scorpio   (2006-07-24 14:55:00) [13]

дырки меня не беспокоят, мне главное чтобы не повтарялись номера


Johnmen   (2006-07-24 14:55:00) [14]

Достаточно просто удалить запись и будет дырка.
Но вопрос, конечно же, в "чем дырки помешали"?


Reindeer Moss Eater   (2006-07-24 14:46:00) [15]

А чем вам дырки-то так помешали?


Sergey13   (2006-07-24 14:42:00) [16]

> [19] Petr V. Abramov ©   (24.07.06 14:37)

Можно, ИМХО, выкрутиться с автономной транзакцией и уникальным индексом. Но можно и как ты говоришь, наверное даже лучше будет.


Petr V. Abramov   (2006-07-24 14:40:00) [17]

> Просто читай seqName.NextVal в триггере, он всегда будет уникальный,
 дырки будут


Petr V. Abramov   (2006-07-24 14:37:00) [18]

> Причем номер в году я бы сделал MAX-ом в тригере после вставки - иначе дыры в нумерации обеспечены.
 а при запросе в триггере max из той же таблицы обеспечено "ora-номернепомню table mutating" :), а в худшем случае - дубли, т.к транзакция может не видеть последний незакоммиченный номер
 можно завести табличку из одной записи типа t_last_num и пользоваться примерно так:
 
create procedure last_num_get(num varchar2 out)
  x number(38)
begin
 update T_LAST_NUM
   set LAST_NUM = LAST_NUM + 1
   returning LAST_NUM into x;
 num := to_char(x)
end

 и дырок не будет, и гарантированно не будет дублей - все желающие получить номер - в порядке общей очереди


Desdechado   (2006-07-24 14:29:00) [19]

Просто читай seqName.NextVal в триггере, он всегда будет уникальный, никакой из 100 человек не получит дублей.
А год и прочую чепуху можешь хранить в отдельном поле записи про миграционные карты.


Scorpio   (2006-07-24 14:28:00) [20]

Вообщето должен быть один сиквенс, просто на каждом сервере к нему будет цепляться свой код., и сливаться на центральный, уже только полученные таблицы.


> А зачем шлепать в сикванс? Нельзя разве шлепать в значение,
>  полученное из сикванса?


будет неудобно. Хотя как мне тогда сделать так, чтобы сиквенс в 00.00 01.01.???? года обнулялся на начальные значения ??, просто пытаюсь чтобы у меня номерами занимался сам сервер, и я не ломал себе голову в программе лишний раз.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо