ORA-04091 .... и при чём тут мутирование?!

Игаев
Дата: 24.11.2009 17:11:11
Вылезла вот такая вот ошибка
"ORA-04091 таблица Links изменяется тригер может не заметить это
ORA-06512 .... line 5
ORA-06512 .... line 9
"
поиском форуму поискал и нашёл что-то внятное для меня только в FAQ-е:
http://www.sql.ru/faq/faq_topic.aspx?fid=513 (Мутирование таблиц)

только вот не понял при чём тут мутирование к моему тригеру - в тригере на insert/update таблицы Links делается запрос к этой Links....

create or replace trigger trigger_Links
after insert or update on Links
for each row
declare
v_count integer(32);
v_stop  integer(32);
v_id    char(8);
cursor cr_Links is select distinct(id) from Links WHERE IdC=:new.IdC AND Mobile=1;
begin
  if(:new.Mobile != :old.Mobile) then
    v_count :=0;
    OPEN  cr_Links;
    LOOP
      FETCH  cr_Links INTO v_id;
      SELECT stop into v_stop FROM Users WHERE Id=v_id;
      if v_stop=0 then  v_count:=v_count+1;end if;
      EXIT WHEN cr_Links%NOTFOUND; 
    END LOOP;
    CLOSE cr_Links;
    UPDATE Client SET Mobile = v_count where IdC=:new.IdC;
   end if; 
end;

Мне надо просто сделать выборку из той таблицы в которой делается изменение, как избавиться от этой ошибки?
orawish
Дата: 24.11.2009 17:14:47
Игаев
..только вот не понял при чём тут мутирование к моему тригеру - в тригере на insert/update таблицы Links делается запрос к этой Links....

дык это вот и есть мутация (почти определение тут дали ;)
_Alex_SMIRNOV_
Дата: 24.11.2009 17:16:37
Игаев, у вас самое классическое мутирование... нельзя в row-level григгере читать ту же табличку... посмотрите а FAQ как это обходить - чеорез еще один триггер уровня тблицы + пакет
Игаев
Дата: 24.11.2009 17:17:25
что-то я не понял - теперь из-за того что я хочу сделать просто select из той же таблицы, то мне лепить эту громоздкую (и пока мне не понятную) вещь из FAQ-а?
Подскажите, пожалуйста, как тут меньшей кровью обойтись не создавая кучу всего непонятного?
tru55
Дата: 24.11.2009 17:17:34
Application Developer’s Guide - Fundamentals

Trigger Restrictions on Mutating Tables

A mutating table is a table that is currently being modified by an UPDATE, DELETE,
or INSERT statement, or a table that might be updated by the effects of a DELETE
CASCADE constraint.
The session that issued the triggering statement cannot query or modify a mutating
table
. This restriction prevents a trigger from seeing an inconsistent set of data.
orawish
Дата: 24.11.2009 17:20:24
Игаев
что-то я не понял - теперь из-за того что я хочу сделать просто select из той же таблицы, то мне лепить эту громоздкую (и пока мне не понятную) вещь из FAQ-а?
Подскажите, пожалуйста, как тут меньшей кровью обойтись не создавая кучу всего непонятного?

танцы с бубном - это следствие того, что (казалось бы) простое ваше хотелово противоречит целостности данных
Игаев
Дата: 24.11.2009 17:29:11
подскажите мне тупому - как SELECT влияет на целостность данных? Я жене обновить запись хочу в той же таблице на которой отрабатывает тригер + тригер выполняется у меня ПОСЛЕ insert/update. Это не "хотелово" - полное не понимание такого огрничения!
Игаев
Дата: 24.11.2009 17:31:10
интересно ..... - если я запихну все эти опреации в процедуру, а в тригере вызову процедуру. Поможет?
tru55
Дата: 24.11.2009 17:33:34
Ключевое слово - триггер FOR EACH ROW

Срабатывание на первую запись INSERT - результат SELECT один, срабатывание на вторую - результат другой (первая уже участвует) и т.д.
Игаев
Дата: 24.11.2009 17:37:21
Ключевое слово - триггер FOR EACH ROW

Срабатывание на первую запись INSERT - результат SELECT один, срабатывание на вторую - результат другой (первая уже участвует) и т.д.

то есть, SELECT будет выполняться при обработке каждой строки. Меня такое вполне устраивает.