триггер оракула при обновлении - PullRequest
0 голосов
/ 28 сентября 2018
CREATE TABLE COUNTRY
(
  COUNTRY_ID            VARCHAR2(2 BYTE)        NOT NULL,
  NAME                  VARCHAR2(200 BYTE),  
  CURRENCY_ID           VARCHAR2(3 BYTE)        DEFAULT 'EUR'

)

CREATE TABLE CURRENCY
(
  CURRENCY_ID      NUMBER                       NOT NULL,--this is sequnce
  NAME             VARCHAR2(20 BYTE),
  VALUE            NUMBER,
  BANK_PERCENTAGE  NUMBER
)


CREATE OR REPLACE TRIGGER update_currency
AFTER UPDATE
   ON SOFTDEV.COUNTRY
   FOR EACH ROW
DECLARE
BEGIN
   if :new.currency_id = :old.currency_id
   then
     null; -- if the currency_id exists then to nothing
    else
   INSERT INTO CURRENCY
   ( CURRENCY_ID,
     NAME,
     VALUE,
     BANK_PERCENTAGE)

   VALUES --line 20
   ( CURRENCY_ID_SEQ.nextval,
     :new.currency_id,
     1,
     0);
         end if;
END;

У меня есть этот триггер при обновлении, который работает нормально, пока не будет валюты_идентификатора, который совпадает со старой валютой .. Когда я пытаюсь вставить валюту, которая существует, я получаю ошибку.UPDATE_CURRENCY ", строка 20 ORA-04088: ошибка во время выполнения триггера 'UPDATE_CURRENCY'

Как решить проблему с уже существующим currency_id?

1 Ответ

0 голосов
/ 28 сентября 2018

Трудно сказать, что может быть причиной вашей ошибки.Но я полагаю, что вы измените свой подход - и не используете триггер.Вам следует избегать выполнения вставок DML, не связанных с запросом, в виде триггеров таблицы.Это может привести к всевозможным проблемам.Вот хорошая отправная точка для изучения проблем: https://www.oracle.com/technetwork/testcontent/o58asktom-101055.html

Я предлагаю вместо этого создать процедуру, которая вызывается для обновления строки в таблице.В этой процедуре вы можете проверить, меняется ли валюта.Если это так, выполните вставку как часть транзакции в этой процедуре.

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

Таким образом вы гарантируете полную транзакцию со всей обработкой ошибок.и логика восстановления всегда запускается при обновлении строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...