2012-06-15 4 views
0

Моя проблема заключается в том, что приведенный ниже триггер работает правильно, за исключением того факта, что заявление об обновлении UPDATE my_dblist SET passive_servername = v_newpassive WHERE server = :NEW.server AND dbname = :NEW.dbname; похоже не происходит. Старая запись удаляется и вставляется в историю правильно, но в новой записи нет старого активного сервера, указанного под именем passive_servername. У меня такое чувство, что это может быть связано с автономностью?Столбец, не обновляющийся в триггере

create or replace 
TRIGGER cluster_check 
AFTER INSERT ON my_dblist 
FOR EACH ROW 
DECLARE 
pragma autonomous_transaction; 
v_duplicates NUMBER; 
v_newpassive varchar2(30); 
BEGIN 
SELECT count(*) INTO v_duplicates FROM my_dblist WHERE passive_servername   = :new.server and dbname = :new.dbname order by 1; 
IF v_duplicates > 0 
THEN 
SELECT server INTO v_newpassive FROM my_dblist WHERE passive_servername = :NEW.server AND dbname = :NEW.dbname ORDER BY 1; 
UPDATE my_dblist 
SET passive_servername = v_newpassive WHERE server = :NEW.server AND dbname = :NEW.dbname; 
INSERT INTO my_dblist_history 
SELECT * FROM my_dblist WHERE passive_Servername = :NEW.server AND dbname = :NEW.dbname; 
DELETE FROM my_dblist 
WHERE passive_Servername = :NEW.server AND dbname = :NEW.dbname; 
END IF; 
commit; 
END; 

ответ

5

Ваш триггер объявлен для использования автономной транзакции. Это почти всегда ошибка, если единственной целью триггера является регистрация попытки изменить строку данных, которые вы хотите сохранить, независимо от того, было ли это изменение в конечном счете успешно выполнено. В этом случае он также, вероятно, будет источником вашей проблемы. Поскольку триггер является автономной транзакцией, он не может видеть незафиксированные изменения, сделанные оператором триггера. Например, ваш оператор UPDATE не увидит строки (строки), которые вызвали запуск триггера, потому что эти строки, по определению, не выполняются в другой транзакции.

Можете ли вы сделать шаг назад и объяснить, в чем именно проблема, которую вы пытаетесь решить? Я предполагаю, что вы пытаетесь использовать автономную транзакцию для работы с исключением из мутирующей таблицы. Это почти всегда ошибка. Исключительное исключение для мутирующих таблиц указывает на то, что у вас есть проблема с моделью данных, поэтому вам гораздо лучше рекомендуется фиксировать модель данных, чем работать с ошибкой. Если вы не можете исправить модель данных, вам нужно будет использовать несколько триггеров для работы с ошибкой мутирующей таблицы.

+0

спасибо, я пошел с вашим советом и реализовал несколько триггеров вместо этого. Твой по-настоящему умный парень :) –

Смежные вопросы