Что терпит неудачу в этом триггере уровня строки? - PullRequest
2 голосов
/ 21 января 2010

У меня есть этот триггер:

create or replace trigger t_calctotal
after insert or update on item_fornecimento
REFERENCING NEW AS NEW OLD AS OLD
for each row

begin

  if inserting then
  dbms_output.put_line(' On Insert');
  update fornecimento f set f.total_enc_fornec = f.total_enc_fornec +:NEW.prec_total_if  where f.id_fornecimento = :NEW.id_fornecimento;

  else
  dbms_output.put_line(' On Update');
  update fornecimento f set f.total_enc_fornec = f.total_enc_fornec - :OLD.prec_total_if +:NEW.prec_total_if  where f.id_fornecimento = :NEW.id_fornecimento;

  end if;

end;

По сути, я хочу обновить общую стоимость заказа (fornecimento), суммируя все элементы в item_fornecimento; Я должен относиться к этому по-другому, если это вставка, если это обновление. Триггер компилируется и все и даже работает один раз, но это был единственный. Я вставил или обновил свои prec_total_if в item_fornecimento в sqldeveloper, но общая сумма заказа (fornecimento) все еще не изменилась: (.

Если это важно, мой f.total_enc_fornec будет нулевым, пока не будет заменен значением, вставленным этим триггером; он печатает выходные данные, но, похоже, не удается обновить.

Ответы [ 2 ]

6 голосов
/ 21 января 2010

Просто чтобы вы знали: ноль + 123 = ноль

Я думаю, это объясняет. Инициализируйте сумму до 0, и все должно работать.

Редактировать

Вы можете сделать это так:

if inserting then
  dbms_output.put_line(' On Insert');
  update fornecimento f set f.total_enc_fornec = nvl(f.total_enc_fornec, 0) +:NEW.prec_total_if  where f.id_fornecimento = :NEW.id_fornecimento;

else
dbms_output.put_line(' On Update');
update fornecimento f set f.total_enc_fornec = nvl(f.total_enc_fornec, 0) - :OLD.prec_total_if +:NEW.prec_total_if  where f.id_fornecimento = :NEW.id_fornecimento;

end if;
0 голосов
/ 09 апреля 2010

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

Если два сеанса примерно в одно и то же время обновляют разные строки в item_fornecimento, которые имеют одинаковый id_fornecimento, fornecimento.total_enc_fornec будет обновляться некорректно, поскольку каждый сеанс не будет видеть незавершенные изменения, сделанные другими сеансами.

Чтобы решить эту проблему, вы, вероятно, закодируете свое приложение для попытки монопольной блокировки родительской записи fornecimento перед обновлением / вставкой элементов для нее.

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