Еще один вопрос по поводу триггеров PL / SQL - PullRequest
0 голосов
/ 05 апреля 2011

У меня возникла проблема со вторым триггером, который мы должны написать относительно следующего:

Я только что написал хранимую процедуру и хранимую функцию, которые служат для вставки новой строки в мою таблицу Orders.Обновление строки вставляет: Ordernum, OrderDate, Customer, Rep, Manufacturer, Product, Qty и SaleAmount.

Теперь мне нужно написать триггер, который обновляет мою таблицу Office, добавляя сумму вновь добавленной продажи.Проблема в том, что не каждому торговому представителю присвоен офис.Я не понимаю, нужно ли мне иметь условие where в разделе «ДЛЯ КАЖДОГО РЯДА», которое каким-то образом предусматривает это, или мне нужно указать это после строки SET Sales.Пока это мой код, но, к сожалению, он обновляет все продажи офисов, а не только тот, к которому относится salesrep:

CREATE OR REPLACE TRIGGER UpdateOffices
   AFTER INSERT ON Orders
   FOR EACH ROW
   BEGIN 
      UPDATE Offices
      SET Sales = Sales + :NEW.Amount
      WHERE Office IN (SELECT RepOffice
                       FROM Salesreps
                       WHERE RepOffice IS NOT NULL);
End;
/
SHOW ERRORS

Sales - это имя столбца в таблице Office.Сумма, если имя используется в хранимой процедуре.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Вам уже посоветовали добавить предикат в Salesreps, например, WHERE Salesrep = :NEW.Rep.Почему бы вам не добавить его в подзапрос?

1 голос
/ 05 апреля 2011

Вы столкнетесь с множеством проблем, реализующих ваше решение с помощью этого метода триггера.

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

Я бы порекомендовал вам реализовать это требование в виде материализованного представления «Обновить при фиксации».

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