#sql #oracle #plsql #oracle11g #database-trigger
#sql #Oracle #plsql #oracle11g #база данных-триггер
Вопрос:
У меня есть следующий триггер, который обновляется, но и откатывается автоматически, я не нахожу причину, пожалуйста, помогите.
К вашему СВЕДЕНИЮ: обновление таблицы UDF_DATA содержит ссылку на внешний ключ CCEX.Таблица запуска КЛИЕНТА.
CREATE OR REPLACE TRIGGER TR_CUSTOMER_PM
AFTER INSERT OR UPDATE ON CCEX.CUSTOMER FOR EACH ROW
DECLARE
i_subscriber_id Number :=3080;
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
pragma autonomous_transaction;
i_syscode ccex.customer.cust_system_code%type;
BEGIN
IF :new.cust_account_number like 'TID%' THEN
i_syscode:= :new.cust_system_code;
update udf_data set value = 'Term'
where subscriber_id = i_subscriber_id
and cust_system_code = i_syscode
and entity_id = '1488_OTA'
and udf_id = '3994_OTA'
and name = 'Primary Manager';
END IF;
EXCEPTION
when others then
raise user_xcep;
END;
/
Комментарии:
1. Я чувствую, что внешний ключ вызывает проблему, но есть ли способ обновить другую таблицу
2. Все в порядке, можете ли вы ответить на этот вопрос, если поняли проблему?
3. Почему вы маскируете любые ошибки, заменяя исключение неопределенным пользовательским исключением? На вашем месте я бы полностью удалил этот обработчик исключений.
4. Автономная транзакция выполняется за пределами области вызывающей транзакции. Это означает, что в вашей автономной транзакции изменение в таблице Customer еще не видно. Я предполагаю, что это приводит к сбою ограничения внешнего ключа, поскольку внешний ключ по-прежнему ссылается на старую версию данных. Как правило, использование автономной транзакции в триггере для выполнения чего-либо другого, кроме регистрации попытки изменения значения, является ошибкой. К сожалению, я не уверен, какую основную проблему вы действительно пытаетесь решить, поэтому я не уверен, каким было бы правильное решение.
Ответ №1:
Поскольку триггер находится в autonomous_transaction
режиме, он должен закрыть транзакцию.
Пожалуйста, добавьте commit
непосредственно перед строкой исключения.