Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

(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;
Скачать: CL | DM;

Наверх




Память: 0.68 MB
Время: 0.047 c
14-1129710010
Nadyafra
2005-10-19 12:20
2005.11.13
Срочно требуется ПРОГРАММИСТ DELPHI/ORACLE (от 1300-2000 у.е.)


14-1129747418
LordOfRock
2005-10-19 22:43
2005.11.13
Подскажите чайнику! /не Делфи :(/


9-1119604921
Dennis
2005-06-24 13:22
2005.11.13
Синтез трехмерных моделей по фотографиям


2-1129569313
Bogdan1024
2005-10-17 21:15
2005.11.13
типо createprocess


14-1129992001
Express
2005-10-22 18:40
2005.11.13
Invalid file name