powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Help ORA-04091 !
8 сообщений из 8, страница 1 из 1
Help ORA-04091 !
    #32045858
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно удалять элемент в дереве, имеется триггер
Код: 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
Help ORA-04091 !
    #32045861
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя в триггере управляющем объектом вновь управлять этим же объектом. Триггер просто пытается запуститься еще раз и т.д.
...
Рейтинг: 0 / 0
Help ORA-04091 !
    #32045862
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этого-то и хотелось достичь, дабы удалить всех потомков каскадом....
То есть с помощью триггера сделать это невозможно?
А если создать рекурсивную функцию?
...
Рейтинг: 0 / 0
Help ORA-04091 !
    #32045865
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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
Help ORA-04091 !
    #32045866
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>.dba
там и нашел.
с триггером я все понял, а все-таки, рекурсивная функция будет жить/работать или имеет смысл биться другим способом?
...
Рейтинг: 0 / 0
Help ORA-04091 !
    #32045868
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделай лучше так
alter table osection add constaint osection_connstraint foreign key (os_parent) references osection (os_id) on delete cascade
...
Рейтинг: 0 / 0
Help ORA-04091 !
    #32045875
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот триггер уже срабатывает на удаление из OSECTION
Зачем тебе еще раз из нее удаление?
Для каскадного удаления надо установить constraint on cascade delete для подчиненных таблиц. При удалении из основной удалятся все записи которые ссылаются на данную.
...
Рейтинг: 0 / 0
Help ORA-04091 !
    #32045878
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы, особенно nick, он не первый раз меня выручает :) действительно помогло.

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


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