Как предотвратить рекурсию триггера в SQLite? - PullRequest
2 голосов
/ 04 декабря 2011

Я пытаюсь создать триггер, который будет обновлять оценки всех друзей ученика, чья оценка обновлена.

create trigger upgrade
after update on Highschooler
when new.grade=old.grade+1 and trigger_nestlevel() < 2
begin
    update Highschooler
    set grade=new.grade
    where ID in (
      select ID2
      from Friend
       where ID1=old.ID
    )
;
end

друзей друзей (друзей ...) человека, чьиоценка повышается, также «улучшается», как я могу остановить это?

1 Ответ

3 голосов
/ 04 декабря 2011

Как вы можете прочитать в Пределы В SQLite вы можете очистить возможность рекурсивного триггера, используя оператор PRAGMA recursive_triggers .

10,Максимальная глубина рекурсии триггера

SQLite ограничивает глубину рекурсии триггеров для предотвращения использования неограниченным объемом памяти оператора, использующего рекурсивные триггеры.

До SQLite версии 3.6.18, триггеры не были рекурсивными, и поэтому этот предел был бессмысленным.Начиная с версии 3.6.18, рекурсивные триггеры поддерживались, но их необходимо было явно включить с помощью оператора PRAGMA recursive_triggers .Начиная с версии 3.7.0, рекурсивные триггеры включены по умолчанию, но их можно отключить вручную с помощью PRAGMA recursive_triggers .SQLITE_MAX_TRIGGER_DEPTH имеет смысл, только если включены рекурсивные триггеры.

Максимальная глубина рекурсии по умолчанию составляет 1000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...