Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1129835026
BaxTMaH
2005-10-20 23:03
2005.11.13
TtreeView


14-1129788075
dreamse
2005-10-20 10:01
2005.11.13
Проблема с доступом к сайту !


2-1130078972
muzik@NT!
2005-10-23 18:49
2005.11.13
TCanvas глючит или я?


14-1130086693
DK2DK2DK2
2005-10-23 20:58
2005.11.13
Автоматизированое составление расписаний


2-1129802515
Андрей__
2005-10-20 14:01
2005.11.13
DBLookUpComboBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский