Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Help ORA-04091 ! / 8 сообщений из 8, страница 1 из 1
26.08.2002, 13:08
    #32045858
Speaker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
Нужно удалять элемент в дереве, имеется триггер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create trigger OSECTION_DELETE BEFORE DELETE on osection for each row
begin
    delete from oslist
    where oslist.os_id = :old.os_id;

    delete from osection
    where osection.os_parent = :old.os_id;
end;


при попытке удалить выдает следующую ошибку:

ORA-04091 table string.string is mutating, trigger/function may not see it
Cause: A trigger (or a user defined PL/SQL function that is referenced in this
statement) attempted to look at (or modify) a table that was in the middle of
being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table.

Кто-нибудь может помочь?
...
Рейтинг: 0 / 0
26.08.2002, 13:20
    #32045861
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
Нельзя в триггере управляющем объектом вновь управлять этим же объектом. Триггер просто пытается запуститься еще раз и т.д.
...
Рейтинг: 0 / 0
26.08.2002, 13:25
    #32045862
Speaker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
Этого-то и хотелось достичь, дабы удалить всех потомков каскадом....
То есть с помощью триггера сделать это невозможно?
А если создать рекурсивную функцию?
...
Рейтинг: 0 / 0
26.08.2002, 13:30
    #32045865
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
>ORA-04091 table string.string is mutating, trigger/function
>may not see it

Это очень известное ограничение - нельзя в теле триггера (row trigger или statement trigger с delete cascade опцией для связанных таблиц) пытаться изменить эту же таблицу.

Oracle8i Application Developer's Guide - Fundamentals
Release 2 (8.1.6)
Part Number A76939-01

12
Using Triggers
...
Рейтинг: 0 / 0
26.08.2002, 13:33
    #32045866
Speaker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
>.dba
там и нашел.
с триггером я все понял, а все-таки, рекурсивная функция будет жить/работать или имеет смысл биться другим способом?
...
Рейтинг: 0 / 0
26.08.2002, 13:35
    #32045868
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
сделай лучше так
alter table osection add constaint osection_connstraint foreign key (os_parent) references osection (os_id) on delete cascade
...
Рейтинг: 0 / 0
26.08.2002, 13:48
    #32045875
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
Этот триггер уже срабатывает на удаление из OSECTION
Зачем тебе еще раз из нее удаление?
Для каскадного удаления надо установить constraint on cascade delete для подчиненных таблиц. При удалении из основной удалятся все записи которые ссылаются на данную.
...
Рейтинг: 0 / 0
26.08.2002, 13:52
    #32045878
Speaker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help ORA-04091 !
Всем спасибо за ответы, особенно nick, он не первый раз меня выручает :) действительно помогло.

>MW
Дело в том что в этой таблице хранится дерево, то есть хотелось чтобы при удалении корня удалялось не только содержимое подчиненной таблицы но и все узлы в ЭТОЙ ЖЕ таблице, которые ссылаются на этот корень
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Help ORA-04091 ! / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]