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

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

(Oracle) Как правильно написать триггер для автоприсвоения ID [MySQL]


Страницы:   1 2 3 4 5 6

ANB ©   (2005-09-27 14:12:00) 

Попробовал сделать так :

create or replace trigger GT_Product_PK_TR
 before insert on GT_Product
 for each row
declare
begin
 if :New.ID is null then
  select GT_Product_SQ.Nextval into :New.ID from dual;
 end if;
end GT_Product_PK_TR;

Получил проблему - если ID жестко задавать в инсертах, то сиквенс не мотается и потом лезут ошибки.
Переделал :

create or replace trigger GT_Product_PK_TR
 before insert on GT_Product
 for each row
declare
Cur_SQ number;
begin
 if :New.ID is null then
  select GT_Product_SQ.Nextval into :New.ID from dual;
 else
  select GT_Product_Firm_SQ.Currval into Cur_SQ from dual;
  while (Cur_SQ < :New.ID) loop
   select GT_Product_Firm_SQ.Nextval into Cur_SQ from dual;
  end loop;
 end if;
end GT_Product_PK_TR;

В таком варианте вроде, получше, но все равно можно нарваться на дублирование записей. Можно воткнуть еще проверку на существование уже сгенеренного ID и прокручивать сиквенс до нужного значения, но, во первых, полезут ошибки "таблица мутирует", во вторых это ничего особо не даст, т.к. если я умудрюсь в двух разных сессиях сгенерить один и тот же ID, то про триггер на них никак не поругается, так как записи еще не закоммичены, а проблема вылезет при коммите. Хотя, возможно, я не так понял механизм транзакций.


Fay   (2005-09-29 16:47:00) [21]

2 ANB ©   (29.09.05 16:45) [86]
>>  в следующей версии генераторы появятся
В MSSQL 2015? 8)


Val   (2005-09-29 16:46:00) [22]

потому что не обращаются к таблице в триггере перед вставкой :)


ANB   (2005-09-29 16:46:00) [23]


> Fay ©   (29.09.05 16:43) [85]
> 2 ANB ©   (29.09.05 16:40) [82]
> Такое "можно" называется "нельзя".
- Гы, гы. Но время от времени на форуме появляются вопросы - как это сделать.


Fay   (2005-09-29 16:46:00) [24]

2 Курдль ©   (29.09.05 16:41) [83]
>> То ли SCOPE_IDENTITY, то ли нечто похожее!
Ни в коем случае!!


ANB   (2005-09-29 16:45:00) [25]


> Курдль ©   (29.09.05 16:41) [83]
- ты можешь получить только текущее значение. Следующее же - это + 1, но так делать не кузяво, так как есть вероятность, что пользователь нарвется на дубль при синхронной работе. Это будет тоже самое, что Max(ID) + 1. Т.е. никакого смысла.
А зачем его получать до ? Плюс, ходят слухи, что таки в следующей версии генераторы появятся.


Fay   (2005-09-29 16:43:00) [26]

2 ANB ©   (29.09.05 16:40) [82]
Такое "можно" называется "нельзя".


ANB   (2005-09-29 16:42:00) [27]


> Моему любимому MSSQL действительно очень не хватает тригеров
> before
- хоть я MS SQL и не люблю, но вот логика триггеров мне там больше понравилась. Во всяком случае, мутаций таблиц там не бывает.


Курдль   (2005-09-29 16:41:00) [28]


> Собственно, именно такой пример от тебя я и хотел услышать.


Автор писал про оракл:


> ANB ©   (27.09.05 15:38) [16]
> 1. Отмечал оракл, но так как на форуме бага, то написал
> еще и в скобках тип БД.


Как получить ID заранее с 3-х СУБД я привел в [63]! А вот как это сделать в MS SQL - я не знаю! Но чую, что кто-то знает! :)  То ли SCOPE_IDENTITY, то ли нечто похожее!


ANB   (2005-09-29 16:40:00) [29]


> Как заранее получить следующее уникальное значение идентификатора
> определенной таблицы в MS SQL?
- а посмотреть и перемотать можно и ручками. Причем в обе стороны. Но лучше так не делать.


Fay   (2005-09-29 16:38:00) [30]

2 Курдль ©   (29.09.05 16:13) [78]
>> Как заранее получить следующее уникальное значение
>> идентификатора определенной таблицы в MS SQL?
Никак, но как это связано с "в оракле есть returning" ?

2 Danilka ©   (29.09.05 16:29) [79]
на самом деле, таких примеров можно встретить произвольное количество.
Моему любимому MSSQL действительно очень не хватает тригеров before и генераторов (которые не зависят от транзакций).


ANB   (2005-09-29 16:38:00) [31]


> Курдль ©   (29.09.05 16:13) [78]


> Как заранее получить следующее уникальное значение идентификатора
> определенной таблицы в MS SQL?

- а зачем ?
Открываем транзакцию
Инсертим в мастер-таблицу
Узнаем ID добавленной записи
Инсертим в подчиненные таблицы
Коммитим.


Danilka   (2005-09-29 16:29:00) [32]

Курдль ©   (29.09.05 16:13)
Как заранее получить следующее уникальное значение идентификатора определенной таблицы в MS SQL?


Я не знаю ниодного примера, когда без этого нельзя было-бы обойтись.
Собственно, именно такой пример от тебя я и хотел услышать.
Ты привел пример, когда все равно обойтись можно другими способами, я просто думал, что есть что-то еще, более непреодолимое. :)


Курдль   (2005-09-29 16:13:00) [33]


> Fay ©   (29.09.05 16:10) [77]
> В каком смысле?


Как заранее получить следующее уникальное значение идентификатора определенной таблицы в MS SQL?


Fay   (2005-09-29 16:10:00) [34]

2 Курдль ©   (29.09.05 16:04) [76]
>> Его нельзя вынуть запросом!
В каком смысле?


Курдль   (2005-09-29 16:04:00) [35]


> ANB ©   (29.09.05 15:40) [74]
>
>
> > Курдль ©   (29.09.05 15:09) [72]
>
>
> > Val ©   (29.09.05 15:11) [73]
>
> Чисто принципиально, в таблицы можно писать данные не только
> из программы - клиента, когда можно просто настроить компоненты
> (это и в OADC работает и в DOA). И проблема с получением
> автосгенеренных в триггере значений у меня не стоит, т.к.
>  в оракле есть returning (кстати, в MS SQL есть @identity(если
> я синтаксис не перепутал)).
>


1. Мало кто понял, зачем все эти тибидоханья? :)
Чтобы вручную установить currval последовательности? Так оно и так устанавливается вручную!

2. @@identity есть, но доступен только В МОМЕНТ ИСПОЛНЕНИЯ DML!
Его нельзя вынуть запросом!


Val   (2005-09-29 15:57:00) [36]


> И проблема с получением автосгенеренных в триггере значений
> у меня не стоит

что я и говорил ранее. причем невзирая на returning.


ANB   (2005-09-29 15:40:00) [37]


> Курдль ©   (29.09.05 15:09) [72]


> Val ©   (29.09.05 15:11) [73]

Чисто принципиально, в таблицы можно писать данные не только из программы - клиента, когда можно просто настроить компоненты (это и в OADC работает и в DOA). И проблема с получением автосгенеренных в триггере значений у меня не стоит, т.к. в оракле есть returning (кстати, в MS SQL есть @identity(если я синтаксис не перепутал)).


Val   (2005-09-29 15:11:00) [38]

думаю, никто не понял :)


Курдль   (2005-09-29 15:09:00) [39]


> Val ©   (29.09.05 15:03) [70]


При работе с компонентами "DOA", например, идентификатору ставится в соответствие последовательность в дизайн-тайме прямо в инспекторе объектов.
Я, видимо, так и не понял, в чем проблема автора :(


Danilka   (2005-09-29 15:06:00) [40]

Курдль ©   (29.09.05 15:02)

> Danilka ©   (29.09.05 14:48) [67]
> Делаешь на клиенте запись в мастер-таблицу, затем, полученое
> значение ид (ретурнингом или еще как) прописываешь в детальных
> таблицах и уже их и апплишь.

"Делаешь на клиенте запись в мастер-таблицу". Т.е. ее записываешь в реальную БД, открыв транзакцию, и держишь ее открытой, пока не набьешь в БД всех зависимых?


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


Страницы:   1 2 3 4 5 6

Наверх

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