![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при написании триггеров - 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]
Бесконечная рекурсия..............:))))))))))))
Бороться надо стандартными способами...