powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна помощь с триггером
13 сообщений из 13, страница 1 из 1
Нужна помощь с триггером
    #32133685
Tany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблички Table и Table2. Column2 из Table2 - ссылка на Table. Хочу, чтобы эта ссылка в Table 2 обнулялась, если столбец Column1 в Table устанавливается в 1. Создаю такой триггер
CREATE OR REPLACE TRIGGER TU_TABLE
AFTER
UPDATE OF "COLUMN1"
ON TABLE
FOR EACH ROW
begin
if :new.COLUMN1='1'
then
update TABLE2
set
TABLE2.COLUMN2 = null
where
:old.COLUMN2=TABLE2.COLUMN2;
end if;
END;

При его срабатывании происходит ошибка:
ORA-04091: table TABLE is mutating, trigger/function may not see it
ORA-06512: at "TU_TABLE", line 4
ORA-04088: error during execution of trigger "TU_TABLE"

Не могу понять в чем дело. Помогите, пожалуйста!
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133706
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия оракула меньше 8.1.7?
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133708
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delo ne v version a v prinzipe..
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133711
Tany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия 8.0.5
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133718
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 8.1.7 и далее ограничение на мутирующие таблицы сильно ослаблены по сравнению со всеми предыдущими. Поэтому вопрос не в принципе, а в версии.
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133720
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна помощь с триггером
    #32133729
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним тригером необойтись.Воспользуйтесь PLSQL таблицей, создайте пакет. и триггеры BEFOR UPDATE, BEFOR UPDATE FOR EACH ROW и AFTER UPDATE.
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133732
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты переделок триггеров:

1. обновить версию оракула до 8.1.7, не переписывая триггеры.
2. убрать констрэйнты и писать проверку ссылок в триггерах.
3. сделать констрэйнты deferrable и модификации проводить из приложения, а не из триггеров.
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133736
Tany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Oracle X-pert
Описание к ошибке я и так нашла.
Вопрос в том, можно ли написать триггер, который бы делал то, что мне нужно, и как? И почему этот не работает, я же обновление делаю в другой таблице?
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133739
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A kak i otkuda ty delaesh Update?
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133744
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный способ обхода мутации: в row-level триггере заполняешь некую структуру идентификаторами строк (pl/sql-таблицу, например), после чего в statement триггере производишь необходимые действия.
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133753
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите здесь
http://govt.oracle.com/%7Etkyte/Mutate/index.html
...
Рейтинг: 0 / 0
Нужна помощь с триггером
    #32133898
Chira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделай триггер на уровне оперетора UPDATE т.е. без FOR EACH ROW
CREATE OR REPLACE TRIGGER TU_TABLE
AFTER UPDATE OF "COLUMN1" ON TABLE ...
begin
update TABLE2 TT
set TT.COLUMN2 = null
where EXISTS (SELECT NULL FROM TU_TABLE T WHERE TT.COLUMN2 = T.ID AND T.COLUMN1 = 1);
END;
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна помощь с триггером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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