![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
(Oracle) Как правильно написать триггер для автоприсвоения ID [MySQL]
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]
> Делаешь на клиенте запись в мастер-таблицу, затем, полученое
> значение ид (ретурнингом или еще как) прописываешь в детальных
> таблицах и уже их и апплишь.
"Делаешь на клиенте запись в мастер-таблицу". Т.е. ее записываешь в реальную БД, открыв транзакцию, и держишь ее открытой, пока не набьешь в БД всех зависимых?
Во всех детальных уже все "набито". Все что я описал происходит в одной процедуре после нажатия юзером кнопки "записать".