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

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

Ошибка при написании триггеров - deadlock [IB6.x]


Пубертанец ©   (2004-02-02 16:14:00) 

Если в триггере для INSERT выполняю команду INSERT происходит ошибка, а все остальные команды (UPDATE) выполняются нормально. То же самое и для UPDATE и для DELETE - пишет deadlock. А смысл вот в чем: если, например, пользователь вводит новую запись в какую-нибудь таблицу, то одновременно в триггере должна вставиться еще одна запись в эту же таблицу. Как сделать - ума не приложу.


Пубертанец   (2004-02-03 12:34:00) [1]

Не катит то, что как только дело доходит до INSERT, так сразу все вырубается - deadlock.

P.S. Ну нет этой записи в таблице - 100%, но оператор "INSERT" в INSERT-триггере не хочет работать и то же самое для UPDATE-триггера - оператор "UPDATE" не работает, и для DELETE. Т.е. не то, что не работает, а вылетает с ошибкой - deadlock (блокировка по-нашему).


MV   (2004-02-02 18:03:00) [2]

А что не катит?


Пубертанец   (2004-02-02 17:59:00) [3]

И вызывать ее из клиента? Я хочу, чтобы клиент вообще об этом ничего не знал


HSolo   (2004-02-02 17:43:00) [4]

А обязательно делать это все в триггере? Может, проще написать ХП для вставки?


Пубертанец   (2004-02-02 17:41:00) [5]

Нет, такое не катит


MV   (2004-02-02 16:58:00) [6]

А на вставку при условии IF (NEW.NEWREC="F") тоже такая лабуда?
Тогда попробуй подобный код:

declare variable numrows integer;
...
begin
...
IF (NEW.NEWREC="T") then begin
select count(*)
where
FIELD1 <> NEW.FIELD1 + 1 and
FIELD2 <> NEW.FIELD2 + 1 and
FIELD3 <> NEW.FIELD3 + 1 and
NEWREC <> NEW.NEWREC;
into numrows;
if numrows = 0 then /* Если еще не добавлено, тогда - вперед */
INSERT INTO TABLE1(FIELD1, FIELD2, FIELD3, NEWREC)
VALUES(NEW.FIELD1+1, NEW.FIELD2+1, NEW.FIELD3+1, "F") ;

end


Пубертанец   (2004-02-02 16:34:00) [7]

Да тут особо нечего рассказывать. Ну, вот, например, в Before Insert триггере для таблицы TABLE1:

IF (NEW.NEWREC="T") then
INSERT INTO TABLE1(FIELD1, FIELD2, FIELD3, NEWREC)
VALUES(NEW.FIELD1+1, NEW.FIELD2+1, NEW.FIELD3+1, "F");

т.е. в результате хочу, чтобы пользователь ввел одну запись, а в таблицу легло сразу две.


MV   (2004-02-02 16:24:00) [8]

В триггере анализируй наличие уже вставленной записи. Если уже есть - то exit. Если поподробнее расскажешь, поподробнее поможем.


HSolo   (2004-02-02 16:21:00) [9]

А есть признак, по которому можно отличить запись, введенную пользователем, от записи, вставляемой автоматически? Если есть - проверять его в триггере. Если нету - сделать, чтобы был :)


Johnmen   (2004-02-02 16:20:00) [10]

Бесконечная рекурсия..............:))))))))))))
Бороться надо стандартными способами...


Наверх

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