Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Вниз(Oracle) Как правильно написать триггер для автоприсвоения ID Найти похожие ветки
← →
ANB © (2005-09-29 16:38) [80]
> Курдль © (29.09.05 16:13) [78]
> Как заранее получить следующее уникальное значение идентификатора
> определенной таблицы в MS SQL?
- а зачем ?
Открываем транзакцию
Инсертим в мастер-таблицу
Узнаем ID добавленной записи
Инсертим в подчиненные таблицы
Коммитим.
← →
Fay © (2005-09-29 16:38) [81]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:40) [82]
> Как заранее получить следующее уникальное значение идентификатора
> определенной таблицы в MS SQL?
- а посмотреть и перемотать можно и ручками. Причем в обе стороны. Но лучше так не делать.
← →
Курдль © (2005-09-29 16:41) [83]
> Собственно, именно такой пример от тебя я и хотел услышать.
Автор писал про оракл:
> ANB © (27.09.05 15:38) [16]
> 1. Отмечал оракл, но так как на форуме бага, то написал
> еще и в скобках тип БД.
Как получить ID заранее с 3-х СУБД я привел в [63]! А вот как это сделать в MS SQL - я не знаю! Но чую, что кто-то знает! :) То ли SCOPE_IDENTITY, то ли нечто похожее!
← →
ANB © (2005-09-29 16:42) [84]
> Моему любимому MSSQL действительно очень не хватает тригеров
> before
- хоть я MS SQL и не люблю, но вот логика триггеров мне там больше понравилась. Во всяком случае, мутаций таблиц там не бывает.
← →
Fay © (2005-09-29 16:43) [85]2 ANB © (29.09.05 16:40) [82]
Такое "можно" называется "нельзя".
← →
ANB © (2005-09-29 16:45) [86]
> Курдль © (29.09.05 16:41) [83]
- ты можешь получить только текущее значение. Следующее же - это + 1, но так делать не кузяво, так как есть вероятность, что пользователь нарвется на дубль при синхронной работе. Это будет тоже самое, что Max(ID) + 1. Т.е. никакого смысла.
А зачем его получать до ? Плюс, ходят слухи, что таки в следующей версии генераторы появятся.
← →
Fay © (2005-09-29 16:46) [87]2 Курдль © (29.09.05 16:41) [83]
>> То ли SCOPE_IDENTITY, то ли нечто похожее!
Ни в коем случае!!
← →
ANB © (2005-09-29 16:46) [88]
> Fay © (29.09.05 16:43) [85]
> 2 ANB © (29.09.05 16:40) [82]
> Такое "можно" называется "нельзя".
- Гы, гы. Но время от времени на форуме появляются вопросы - как это сделать.
← →
Val © (2005-09-29 16:46) [89]потому что не обращаются к таблице в триггере перед вставкой :)
← →
Fay © (2005-09-29 16:47) [90]2 ANB © (29.09.05 16:45) [86]
>> в следующей версии генераторы появятся
В MSSQL 2015? 8)
← →
Курдль © (2005-09-29 16:51) [91]
> - хоть я MS SQL и не люблю, но вот логика триггеров мне
> там больше понравилась. Во всяком случае, мутаций таблиц
> там не бывает.
Мутаций не бывает, т.к. он блокировщик, а не версионник! :)
> ANB © (29.09.05 16:45) [86]
> А зачем его получать до ? Плюс, ходят слухи, что таки в
> следующей версии генераторы появятся.
Я писал, зачем получать "до" в [66].
Чтобы заполнить максимум данных на клиенте, не держа при этом транзакцию открытой. Это корпоративный стандарт! Никаких "прокруток", никаких "max(ID)" и т.п. Только заранее получить, и пользовать.
← →
Курдль © (2005-09-29 16:53) [92]
> Fay © (29.09.05 16:46) [87]
>
> 2 Курдль © (29.09.05 16:41) [83]
> >> То ли SCOPE_IDENTITY, то ли нечто похожее!
> Ни в коем случае!!
А чего тогда молчат все апологеты MS SQL? 8-()
Это ж полная Ж! :-(
← →
ANB © (2005-09-29 16:56) [93]
> Я писал, зачем получать "до" в [66].
> Чтобы заполнить максимум данных на клиенте
Хм. Странно. Была у меня раз задачка, где я заполнял на клиенте настроечную таблицу, а потом пересылал пачку записей за одну транзакцию. Но мне не пришлось заранее доставать ID. Это некошерный подход, доставать ID до того, как юзер нажмет кнопку ОК.
← →
Fay © (2005-09-29 16:57) [94]2 Курдль © (29.09.05 16:53) [92]
Есть причины, которые позволяют мириться с некоторыми недостатками.
Пожалуй главная (но не единственная, конечно) из них - оптимизатор MSSQL (vs Oracle vs FB).
← →
ANB © (2005-09-29 16:57) [95]
> Курдль © (29.09.05 16:53) [92]
- лучше не ругайся, а изучай грабли. От сумы и работы с MS SQL ни один программист не застрахован :)))
← →
ANB © (2005-09-29 16:58) [96]
> Есть причины, которые позволяют мириться с некоторыми недостатками.
>
> Пожалуй главная (но не единственная, конечно) из них - оптимизатор
> MSSQL (vs Oracle vs FB).
???
← →
Fay © (2005-09-29 16:59) [97]2 ANB © (29.09.05 16:56) [93]
1) А почему, собственно, "до" ?
2) GUID-ы экономить не пробовали ? 8)
← →
Fay © (2005-09-29 17:00) [98]2 ANB © (29.09.05 16:58) [96]
>> ???
!!!
← →
Курдль © (2005-09-29 17:03) [99]
> ANB © (29.09.05 16:57) [95]
> - лучше не ругайся, а изучай грабли. От сумы и работы с
> MS SQL ни один программист не застрахован :)))
Честно говоря, я уже второй год, как перешел в основных проектах на вижуал кролика. Так что эти проблемы совсем канули в лету. Ведь в ADO.NET о таких мелочах, как ID вообще не задумываешься: набил датасэт связанными таблицами и сбросил в базу. Он сам разрулит, кому-что подставить.
← →
kesha © (2005-09-29 18:25) [100]
> Курдль © (29.09.05 17:03) [99]
a esli sna4ala sochranil na lokal PK, a 4eres 2 dnja sbrosil v global DB
← →
Fay © (2005-09-29 19:17) [101]2 kesha © (29.09.05 18:25) [100]
Хоть через а года
← →
Fay © (2005-09-29 19:18) [102]B cmbIcJIE, "XOTb 4EPE3 DBA rODa" 8)
← →
ANB © (2005-09-30 09:27) [103]
> Fay © (29.09.05 17:00) [98]
> 2 ANB © (29.09.05 16:58) [96]
> >> ???
> !!!
- чем оптимизатор MS SQL лучше ораклового ?
← →
Sergey13 © (2005-09-30 09:31) [104]Ну и бодягу вы тут развели. Даже для потрепаловки приличный объем.
А щас еще и холивар начнется.
8-)
← →
ANB © (2005-09-30 10:03) [105]
> Sergey13 © (30.09.05 09:31) [104]
- а всего то просил посмотреть триггер.
← →
Курдль © (2005-09-30 10:14) [106]
> kesha © (29.09.05 18:25) [100]
> a esli sna4ala sochranil na lokal PK, a 4eres 2 dnja sbrosil v global DB
Я не понял, это вопрос? И в чем его суть?
Если просто держать заполненный датасэт (напоминаю - не TDataSet из Delphi, а System.Data.DataSet из ADO.NET, - для особо любознательных), который содержит в себе несколько таблиц со связанными данными, релэйшны и констрэйнты, - то ничего с ним не случится. Все "автоинкрементные" идентификаторы, внешние ключи и т.п. заполняются фиктивными данными (напр. для integer рекомендованы -1, -2, -3...). А в момент исполнения метода Update объекта DataAdapter, все они преобразуются в реальные значения из генераторов, последовательностей и т.п.
Если же Вас интересует, как сохранить данные из такого датасэта на 2 дня, чтобы потом их вставить в БД - есть метод DataSet.WriteXml(string filename);
который сохранит весть датасэт в XML, сохранив всю иерархию данных.
← →
kesha © (2005-09-30 10:34) [107]
> Курдль © (30.09.05 10:14) [106]
Spasibo, potom obdumau.
← →
Danilka © (2005-09-30 10:53) [108][81] Fay © (29.09.05 16:38)
Примеров полезности генераторов/сиквенсов не привязанных к конкретной таблице, таки да, согласен, можно найти.
Триггеры before тоже полезны бывают.
А вот именно необходимость знать значение ид таблицы до инсерта я не могу придумать.
[106] Курдль © (30.09.05 10:14)
То-есть, фактически ADO.NET делает то-же самое, что я написал в [67].
← →
Курдль © (2005-09-30 11:10) [109]
> Danilka © (30.09.05 10:53) [108]
Не согласен по всем 3-м пунктам!
Не вижу пользы от генераторов, не привязанных к таблице, если это не вспомогательная функция типа нумерации разнородных документов, товаров и т.п.
Если в БД хотят сделать общий идентификатор для разных таблиц, производят процесс наследования "inherit" от материнской таблицы. Если на одну запись в материнской таблице не могут ссылаться 2 записи в дочерних - взводят свойство наследования "mutually exclusive".
Пользу получения значения ID до исполнения DML я уже неоднократно приводил - чтобы заполнять связанные таблицы и при этом не держать транзакцию открытой (это важно при многопользовательском режиме).
ADO.NET не делает то-же самое, что ты написал в [67]. Но делает это на самом низком интерфейсном уровне и гарантирует от ошибок прикладного программирования.
← →
ANB © (2005-09-30 11:58) [110]
> Пользу получения значения ID до исполнения DML я уже неоднократно
> приводил - чтобы заполнять связанные таблицы и при этом
> не держать транзакцию открытой (это важно при многопользовательском
> режиме).
- а кто мешает заполнение связанных таблиц проводить быстро в одной транзакции, получив мастер ID после вставки ? Или вообще засунуть все это в один DML ?
А общий сиквенс - штука интересная. При желании можно найти что на что ссылается, даже не имея констрейнта. И при этом можно не делать наследуемых таблиц. Правда мне такой подход не нравится, так как невозможно заполнить жесткие справочники.
Страницы: 1 2 3 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.66 MB
Время: 0.047 c