Допустим, у нас есть следующие структуры таблиц:
documents docmentStatusHistory status
+---------+ +--------------------+ +----------+
| docId | | docStatusHistoryId | | statusId |
+---------+ +--------------------+ +----------+
| ... | | docId | | ... |
+---------+ | statusId | +----------+
| ... |
+--------------------+
Это может быть очевидно, но стоит отметить, что текущим статусом документа является последний введенный журнал статуса.
Система медленно, но верно снижала производительность, и я предложил изменить приведенную выше структуру на:
documents docmentStatusHistory status
+--------------+ +--------------------+ +----------+
| docId | | docStatusHistoryId | | statusId |
+--------------+ +--------------------+ +----------+
| currStatusId | | docId | | ... |
| ... | | statusId | +----------+
+--------------+ | ... |
+--------------------+
Таким образом, у нас будет текущий статус документа именно там, где и должен быть.
Поскольку при создании устаревших приложений я не мог изменить код в устаревших приложениях, чтобы обновить текущий статус таблицы документов.
В этом случае мне пришлось открыть исключение для моего правила, чтобы избежать триггеров.любой ценой, просто потому, что у меня нет доступа к устаревшему коду приложений.
Я создал триггер, который обновляет текущее состояние документа каждый раз, когда новый статус добавляется в историю состояний, и этоработает как заклинание.
Однако в неясной и редко используемой ситуации возникает необходимость УДАЛИТЬ последняя история статуса, а не просто добавление новой.Итак, я создал следующий триггер:
create or replace trigger trgD_History
after delete on documentStatusHistory
for each row
currentStatusId number;
begin
select statusId
into currentStatusId
from documentStatusHistory
where docStatusHistoryId = (select max(docStatusHistoryId)
from documentStatusHistory
where docId = :old.docId);
update documentos
set currStatusId = currentStatusId
where docId = :old.docId;
end;
И вот где я получил печально известную ошибку ORA-04091
.
Я понимаю ПОЧЕМУ Я получаю эту ошибку, хотя я настроил триггер как ПОСЛЕ триггера.
Дело в том, что я не вижу пути обхода этой ошибки.Я некоторое время искал в сети и пока не нашел ничего полезного.
Со временем мы используем Oracle 9i.