2015-05-26 4 views
-3

У меня 2 спусковых на столе один находится перед вставкой и один ПОСЛЕ ВСТАВКА:Как обновить таблицу с помощью триггера AFTER INSERT в той же таблице?

CREATE OR REPLACE TRIGGER DEMO_TRG 
AFTER INSERT 
ON A 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
declare 
PRAGMA AUTONOMOUS_TRANSACTION; 
begin 

UPDATE A 
SET STATUS = 'DONE' 
WHERE id_id =:new.p_id; 

commit; 

END; 
/

Почему команда обновления в после вставки не работает (статус не установлен DONE)? Я что-то пропустил?

+0

Что именно вы пытаетесь сделать? Триггер с 'AUTONOMOUS_TRANSACTION' и' commit' на самом деле не имеет смысла. В чем основная проблема, которую вы пытаетесь решить? Почему бы вам просто не назначить новое значение столбцу «status» в начале триггера? И что делает триггер 'before'? –

+0

Зачем вам это делать во втором триггере по той же транзакции? Неужели это отдельное заявление? То есть. сделайте вставку, затем, спустя некоторое время, выполните отдельную инструкцию обновления.? – Boneist

+0

Запись вставлена ​​в веб-интерфейс (существующий триггер перед вставкой устанавливает свой статус в «ЗАПРОС»). Я пытаюсь имитировать веб-службу, которая обновляет (через определенное время) статус этой записи, вот почему я используйте триггер после вставки и точно так же: СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТРИГГЕР DEMO_TRG ПОСЛЕ ВСТАВКИ НА СПИСОК НОМЕРОВ, КАК НОВЫЙ СТАРЫЙ КАК СТАРЫЙ ДЛЯ КАЖДОЙ РУКИ, объявите PRAGMA AUTONOMOUS_TRANSACTION; begin dbms_lock.sleep (5); ОБНОВЛЕНИЕ СТАТУСА SET = 'DONE' WHERE id_id =: new.p_id; совершить; КОНЕЦ;/у вас есть идея реализовать это (с помощью триггера или другим способом). Спасибо – dbabti

ответ

0

Скорее всего, проблема связана с AUTONOMOUS_TRANSACTION - когда вы это делаете, вы фактически переключаетесь на другую транзакцию, которая не будет знать о вашей незафиксированной транзакции (т. Е. Вашей вставке), поэтому нет ничего для его обновить.

Что вам нужно сделать, это поменять столбец (:new.status := 'DONE') в вашем перед триггером. Или, что еще лучше, избегайте триггеров и сохраняйте логику в хранимой процедуре и не позволяйте кому-либо напрямую вставлять в таблицу, хотя я понимаю, что это может быть большой переключатель, если у вас есть много приложений, вставляемых непосредственно в таблицы и т. Д.

+0

Код должен ждать 5 секунд после вставки записи, а затем автоматически обновлять статус в таблице, как я могу реализовать это динамически? – dbabti

+0

У меня был бы процесс, который делает: insert + commit, подождите 5 секунд, обновляет + commit. Вероятно, sql-скрипт, который имеет вызов dbms_lock.sleep, выполняет ожидание. – Boneist

+0

У меня нет процесса, который может включать в себя фиксацию фиксации вставки 5 секунд, а затем обновление. Запись вставляется через веб-интерфейс и отображается в первый раз «ЗАПРОСИТЬ» как статус для пользователя интерфейса, а затем он должен подождать 5 секунд, чтобы увидеть thi статус изменился на DONE, вот почему я пытаюсь использовать триггер после вставки – dbabti