| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > МУТАЦИЯ? |
| Автор: setnull 21.10.2009, 12:42 |
| Все здравствуйте!!! Как в триггере узнать, замутирована ли та или иная таблица? Спасибо!!! |
| Автор: Zloxa 21.10.2009, 13:19 |
| попытаться выбраться и обработать -04091 |
| Автор: azesmcar 21.10.2009, 13:21 |
| Не слышал о таком способе, но для избежания ошибки мутации можно использовать триггеры "AFTER" или использовать http://www.oracle-base.com/articles/misc/AutonomousTransactions.php. |
| Автор: azesmcar 27.10.2009, 16:02 | ||
Интересно, я решал с помощью autonomous transactions. Насчет AFTER тригеров у меня теоретические знания, на сайте было написано, проверю на днях. Добавлено через 3 минуты и 46 секунд
http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm |
| Автор: DimW 27.10.2009, 16:08 |
быть может имелись ввиду стайтмент тригера, а не for each row... |
| Автор: setnull 27.10.2009, 16:14 | ||
К примеру, есть внешний ключ с каскадным удалением. В триггерах (delete) дочерней таблицы нужно узнать (либо) обновить некоторою информацию по родительской записи. При этом если инициирующим действием будет удаление родительской записи - то все... Можно, конечно и отловить исключение, но вообще можно зарание узнать? Или, также, если пишешь процедуру, реализовывающую более широкую задачу, которую, в свою очередь, среди прочего, можно вызывать и в триггере, и нужно в ней знать состояние по таблицам... |
| Автор: azesmcar 27.10.2009, 16:15 |
возможно, но в процитированной статье об этом ни слова. Надо проверить и книжку полистать. |
| Автор: Zloxa 27.10.2009, 16:22 | ||
В свое время пытался применить такой подход: В полцедуре определил default параметры, и если эти параметры не определены, вычитывал их из базы. если процедуру запускаю из триггера, то заполняю параметры. Добавлено @ 16:24 azesmcar, я бы на месте DimW использовал бы не выражение "быть может", а "СТО ПУДОВ" |
| Автор: azesmcar 27.10.2009, 16:27 | ||
намек понял |
| Автор: DimW 27.10.2009, 16:42 |
вы имеете ввиду на этапе разработки? если так по это просто - мутация это появление не консистентных данных, это естетственный процесс который происходит при использовании DML в промежутке между началом выполнения оператора и его завершением, единственное место где на это можно нарваться это строковые тигеры, т.к. один оператор может изменять больше одной позиции в таблице, поэтому при реализации логики в тригерах нужно помнить какие таблицы могут быть задействованы в данной транзакции, любая попытка обратиться к ним приведет к ошибке - которая всего лишь предупреждает вас что данные уже не такие как были до выполнения действия. если вы это понимаете то есть возможность забить на заботы сервера и воспользоваться autonomous transactions. это как вариан, но я так не делаю и вам не советую! проше реализовать всю вашу логику в процедурах и пользоваться ими для удаления и обновления статистики. Добавлено через 4 минуты и 41 секунду да фиг знает может просто ###статья была |
| Автор: Zloxa 27.10.2009, 16:48 | ||
|
| Автор: DimW 27.10.2009, 16:48 |
| решеточки то всетаки поставились Добавлено через 1 минуту и 55 секунд ух хитрец!!!! красяво |