Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Создание тригера   Найти похожие ветки 

 
Scorpio ©   (2006-07-24 13:34) [0]

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

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


 
Sergey13 ©   (2006-07-24 13:37) [1]

Какой тригер то?

>создавал к ней сиквенцию
Это DDL, который в тригерах не прокатит. Может тебе job запускать по расписанию?

ЗЫ% А нафига сиквенс на день?


 
Petr V. Abramov ©   (2006-07-24 13:39) [2]

> Scorpio ©
 похоже, будет проще, если Вы опишете, что в конце концов хотите получить.


 
Scorpio ©   (2006-07-24 13:41) [3]

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


 
Scorpio ©   (2006-07-24 13:42) [4]

у меня одновременно с БД работает порядка 100 человек


 
Sergey13 ©   (2006-07-24 13:47) [5]

2 [3] Scorpio ©   (24.07.06 13:41)
> я с ораклом тока разбираюсь.
Это то понятно. 8-)

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

Какой номер? Уникальный в разрезе чего?

> у меня одновременно с БД работает порядка 100 человек
Ну и что?


 
Johnmen ©   (2006-07-24 13:47) [6]


>  Раньше он у меня создавался програмно,


> у меня одновременно с БД работает порядка 100 человек

>

И не разу не падало?! Вот же везение! :)


 
Scorpio ©   (2006-07-24 13:56) [7]

Например есть база лиц. Далее человек например едет ч/з границу, на КП он заполняет миграционный талон его вносят в БД. Он должен получить к этому талону номер, этот номер и должен быть уникальным.


 
Reindeer Moss Eater ©   (2006-07-24 13:57) [8]

Ну и зачем здесь вагон сиквансов ?


 
Scorpio ©   (2006-07-24 14:01) [9]

а как мне получить номер, мне как мнимум в этом номере нужен год


 
Sergey13 ©   (2006-07-24 14:04) [10]

> [9] Scorpio ©   (24.07.06 14:01)
> а как мне получить номер, мне как мнимум в этом номере нужен
> год

В номерах нет никаких годов. И месяцев тоже нет.


 
Reindeer Moss Eater ©   (2006-07-24 14:08) [11]

а как мне получить номер, мне как мнимум в этом номере нужен год

<Цитата>

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


 
Scorpio ©   (2006-07-24 14:11) [12]

скажем так, в номерах давольно много информации зашито, и второе, разве нельзя использовать одно и тоже имя сиквенции, просто удаляя старое и создавая новое ??


 
Reindeer Moss Eater ©   (2006-07-24 14:14) [13]

Ты не понял.
С одной стороны тебе не понятно, как получить номер.
С другой стороны, в момент, когда нужно тянуть значение из сикванса, тебя не беспокоит сложность вопроса как определить из какого именно сикванса тянуть номер и как при этом использовать динамический SQL.

Какое-то несоответствие налицо.


 
Scorpio ©   (2006-07-24 14:18) [14]

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


 
Reindeer Moss Eater ©   (2006-07-24 14:21) [15]

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

Можно сделать хотябы чтобы только год мне шлепала в сиквенс ??
А зачем шлепать в сикванс? Нельзя разве шлепать в значение, полученное из сикванса?


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

2 [12] Scorpio ©   (24.07.06 14:11)
> скажем так, в номерах давольно много информации зашито,
Тогда это не номер, а составной код.

> и второе, разве нельзя использовать одно и тоже имя сиквенции,
> просто удаляя старое и создавая новое ??
Нафига? ИМХО, тебе надо кроме ИД-шника ввести поля сотавляюшие составной (сори за тавтологию) ключ - альтернативный. Отдельно год, номер в году, еще что-то что надо. Причем номер в году я бы сделал MAX-ом в тригере после вставки - иначе дыры в нумерации обеспечены. MAX тоже от них не спасает, но делает меньшими.


 
Scorpio ©   (2006-07-24 14:28) [17]

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


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


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


 
Desdechado ©   (2006-07-24 14:29) [18]

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


 
Petr V. Abramov ©   (2006-07-24 14:37) [19]

> Причем номер в году я бы сделал 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

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


 
Petr V. Abramov ©   (2006-07-24 14:40) [20]

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


 
Sergey13 ©   (2006-07-24 14:42) [21]

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

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


 
Reindeer Moss Eater ©   (2006-07-24 14:46) [22]

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


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

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


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

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


 
Desdechado ©   (2006-07-24 14:59) [25]

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


 
Petr V. Abramov ©   (2006-07-24 15:15) [26]

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

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


 
Scorpio ©   (2006-07-24 17:57) [27]


> 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
>


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


 
Reindeer Moss Eater ©   (2006-07-24 18:03) [28]

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


 
Scorpio ©   (2006-07-24 18:32) [29]

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


 
Petr V. Abramov ©   (2006-07-24 18:40) [30]

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

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


 
Petr V. Abramov ©   (2006-07-24 18:42) [31]

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


 
Scorpio ©   (2006-07-24 19:07) [32]


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


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

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

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


 
Petr V. Abramov ©   (2006-07-24 19:23) [33]

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

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

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


 
Sergey13 ©   (2006-07-25 08:26) [34]

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

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


 
Scorpio ©   (2006-07-25 09:52) [35]


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

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


 
Petr V. Abramov ©   (2006-07-25 14:18) [36]

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.051 c
1-1155628054
трям
2006-08-15 11:47
2006.09.24
Как определить Rect выделенной ячейки в DBGrid ?


2-1157350865
vegarulez
2006-09-04 10:21
2006.09.24
По поводу фискальных регистраторов.


15-1157617434
AzovSky
2006-09-07 12:23
2006.09.24
Программа для резервирования исходников и сборки версий


15-1157028147
Ega23
2006-08-31 16:42
2006.09.24
Это всё ваши армейские ветки виноваты!


15-1157100888
Dbn
2006-09-01 12:54
2006.09.24
С праздником, друзья!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский