У меня есть странное деловое требование, которое меня озадачило. Некоторые предпосылки: в основном у меня есть две таблицы для отслеживания улучшений программы: Enhancement and Bug. Связь для улучшения -> Ошибка - 1: m, а таблица ошибок имеет столбец EnhancementID с внешним ключом.Дизайн базы данных: состояние одной таблицы на основе другой
В обеих таблицах есть столбец «Статус», но это становится сложной задачей. Мое требование состоит в том, что статус улучшения зависит от связанных с ним ошибок. Например, если у нас есть 3 ошибки с параметром EnhancementID из 100 и состояния «In Testing», то статус Enhancement 100 должен автоматически устанавливаться на «In Testing». Существует несколько правил о статусе.
Эта база данных используется несколькими приложениями, поэтому моя первая мысль заключалась в использовании триггера «On Update» в таблице Bug. Поскольку у триггера был оператор Select в таблице запуска, я получил ошибку «mutating table» (я должен запросить статусы всех ошибок с указанным EnhancementID при срабатывании триггера). Теперь я пытаюсь реализовать три триггерных решения, описанных здесь: http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936, но я опасаюсь вкладывать столько логики в триггеры базы данных.
Так что мой вопрос: я приближаюсь к этой проблеме разумно? Есть ли лучший способ, который кто-то мог бы предложить? Возможно, используя представление для статуса Enhancement?
Я фактически создавал свои триггеры для предложений в этом обходном пути Тома Ките. Еще одна проблема заключается в том, что я не могу изменить приложения для использования другой таблицы из текущей таблицы Enhancement. Можно ли обновить статус таблицы Enhancement на основе этого представления? – user2811300
Итак, вы пытаетесь обойти приложение с помощью триггеров, это должно быть ... неприятно! Вы можете переименовать свою таблицу и вызвать представление «повышение», но это, вероятно, вызовет больше проблем, которые он решает. Действительно, если у вас нет контроля над приложением, непредсказуемые последствия будут трудно предсказать. –
Согласитесь с @VincentMalgrat - используйте представление, если можете. Триггерный подход не будет работать корректно, если у вас нет какой-либо формы блокировки (что не предусмотрено обходным решением на основе триггеров) - основная проблема заключается в том, что триггер не может «видеть» изменения, сделанные другими транзакциями (например, добавление или обновление другой ошибки со статусом «In Testing»). –