Я использую библиотеку ASIHttpRequest, чтобы каждую минуту запрашивать обновления у веб-службы. Приложение получает строку json и анализирует ее. Работает нормально.
Но я ' + --------- + + -------------------- + + ---------- + | docId | | docStatusHistoryId | | ...
Допустим, у нас есть следующие структуры таблиц:
documents docmentStatusHistory status
+---------+ +--------------------+ +----------+
| docId | | docStatusHistoryId | | statusId |
+---------+ +--------------------+ +----------+
| ... | | docId | | ... |
+---------+ | statusId | +----------+
| ... |
+--------------------+
Это может быть очевидно, но стоит отметить, что текущий статус документа - это последний введенный в историю статусов.
Система работала медленно, но медленно. производительность, безусловно, ухудшается, и я предложил изменить приведенную выше структуру на:
documents docmentStatusHistory status
+--------------+ +--------------------+ +----------+
| docId | | docStatusHistoryId | | statusId |
+--------------+ +--------------------+ +----------+
| currStatusId | | docId | | ... |
| ... | | statusId | +----------+
+--------------+ | ... |
+--------------------+
Таким образом, мы будем иметь текущий статус документа там, где он должен быть.
Поскольку унаследованные приложения были созданы, я не мог изменить код в устаревших приложениях, чтобы обновить текущий статус в таблице документа.
В этом случае мне пришлось открыть исключение из моего правила, чтобы любой ценой избежать триггеров, просто потому, что у меня нет доступа к исходному коду приложений.
Я создал триггер, который обновляет текущий статус документа каждый раз, когда новый статус добавляется в историю статусов, и он работает как чудо.
Однако в неясной и редко используемой ситуации возникает необходимость to УДАЛИТЬ последнюю историю статусов вместо простого добавления нового. Итак, я создал следующий триггер:
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.