Триггер Oracle перед обновлением - PullRequest
0 голосов
/ 17 марта 2019

Я новичок в синтаксисе Oracle SQL.Я хочу изменить order_status_code из Orders, когда Invoice s invoice_status_code был установлен в 1. Однако, когда я изменяю invoice_status_code, он печатает ошибку, которая говорит Cannot update Orders because Shipment exists.

create or replace TRIGGER change_order_status
before update of invoice_status_code on Invoice
for each row
begin 
   if :new.invoice_status_code = 1 then 
      update Orders 
      set order_status_code = 1
      where order_id = :new.order_id;
    end if;
end;

Вот как я обновляюсь

update invoice 
set invoice_status_code = 1
where invoice_number = 2

Сообщение об ошибке:

Error starting at line : 2 in command -
update invoice 
set invoice_status_code = 1
where invoice_number = 2
Error report -
ORA-20005: Cannot update Orders because Shipment exists.

ER diagram

1 Ответ

1 голос
/ 17 марта 2019

Исходя из второй ошибки в вашем комментарии, я предполагаю, что в shipment есть внешний ключ, который ссылается на (order_id, order_status_code) в orders.Так как у вас есть строка в shipment, использующая ее для ссылки на строку в orders, вы не можете изменить столбец в orders.

Кажется странным, что у вас есть order_status_code в ordersshipment и invoice.Предполагая, что это относится к состоянию одной строки в orders, я ожидаю, что она будет в этой таблице, а не в других.

PS Пользовательские коды ошибок находятся между ORA-20000 иORA-20999.Первая ошибка остается в этом диапазоне.

...