| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > Триггеры и первичные ключи |
| Автор: mgukov 27.12.2009, 19:41 |
| Есть 2 таблице - ЗАКАЗ и ВЫДАЧА, как показано на рисунке. Ключевое поле одной таблицы является ключевым и внешним полем другой таблицы. Мне нужен триггер который при вставке строки в первую таблицу, добавляет строку во вторую. Проблема с первичным ключем. Подскажите как можно реализовать такой триггер? |
| Автор: v2v 27.12.2009, 23:35 | ||
если я правильно понял, то триггер должен выглядеть следующим образом:
|
| Автор: mgukov 28.12.2009, 00:10 |
| Именно так я и делал, однако возникает ошибка: Error starting at line 4 in command: INSERT INTO ЗАКАЗ VALUES(100, 'не оплачен', NULL, 100, 104) Error report: SQL Error: ORA-02291: integrity constraint (USER1.RELATION_6) violated - parent key not found ORA-06512: at "USER1.TIA_ЗАКАЗ", line 2 ORA-04088: error during execution of trigger 'USER1.TIA_ЗАКАЗ' 02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found" *Cause: A foreign key value has no matching primary key value. *Action: Delete the foreign key or add a matching primary key. Так как в таблице ВЫДАЧА поле заказ_ид является внешним ключем, то при добавлении в нее новой записи с :new.заказ_ид, oracle пытается найти это значение в таблице ЗАКАЗ, но этого (:new.заказ_ид) значения там еще нет. |
| Автор: Zloxa 28.12.2009, 01:26 | ||
есть. если триггер after, как написал v2v.
|
| Автор: mgukov 28.12.2009, 01:42 |
| Да, действительно. Всем спасибо |
| Автор: Zloxa 28.12.2009, 10:31 |
| меня в этой ситуации больше всего интересует - от чего при проверке констрейнта ошибка не поднимается. Маcтер таблица ведь находится в состоянии модификации - мутирует. Шаманство какоето. |
| Автор: DimW 28.12.2009, 11:07 | ||
да вроде ровно все, в случае с before:
в случае с after, все выполняется в одной транзакции, так что в случае исключения все откатится. |
| Автор: Zloxa 28.12.2009, 13:45 |
| DimW, то что ровно - то понятно. Не понятно почему в частном случае проверки целостности по FK позволяется доступ к мутирующей таблице, в то время как в общем случае - нет |