Проблема с триггером

Проблема с триггером

от Иван Сергеев -
Количество ответов: 2

Добрый день! Опять требуется ваша помощь.

Моя задача сделать так, чтобы в БД Moodle (на Oracle) при появлении новой строки в одной из таблиц (таблица m_certificate_issues, куда пишутся данные о полученных сертификатах) данные из нее перекочевали в другую БД. Делаю для этого триггер.

Но вот проблема. При выключенном триггере все работает хорошо. Но если его включить, то данные в таблицу к которой он привязан не записывются. Т.е. я пытаюсь получить сертификат, но запись не добавляется, и сертификат я не получаю. При этом не имеет значения какой insert в триггере - локальный или использующий другую базу, главное что есть там insert. Я голову сломал, не могу понять как триггер может повлиять на работу таблицы, к которой он привязан... а уж тем более что он ее не изменяет.

Может быть где-то есть параметр, запрещающий писать свой код в базе?

Примечание: при прямой вставке строки в базе все отрабатывет нормально. Значит, именно приложение не дает реализовать нужное.

В ответ на Иван Сергеев

Re: Проблема с триггером

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle

обычно триггер возвращает значение по которому вся операция либо продолжается либо отменяется. Убедитесь что он успешно выполняется и возвращает код успешного завершения.

IMHO нужно читать про отладку триггеров в оракле. К moodle это не имеет отношение.

В ответ на Иван Сергеев

Re: Проблема с триггером

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

С триггерами много нюансов есть. С конкретно оракловскими - свои есть особенности. Так что только общие советы:

Не выполняется ли операция в транзакции? Тогда невозможность записать в другую таблицу приведёт к отмене всей транзакции, в том числе и запись в основную таблицу. Возможно moodle тоже создаёт транзакции.

Нет ли каких то ещё зависимостей между таблицами? Как, например, если триггер пишет в туже таблицу, что и сам вызывается.

Какой триггер вы используете? Если BEFORE INSERT, попробуйте заменить на AFTER INSERT и наоборот.

 Попробуйте перенести код триггера в процедуру и вызывать её из триггера. Добавьте в эту процедуру максимум отладки типа протоколирования вызовов в отдельной таблице.

Здесь аналогичная проблема, почитайте http://moodle.org/mod/forum/discuss.php?d=95777