我遇到了关于以下内容的第二个触发器的问题:
我刚刚编写了一个存储过程和存储函数,用于在我的Orders表中插入一个新行。行更新插入:Ordernum,OrderDate,Customer,Rep,Manufacturer,Product,Qty和SaleAmount。
我现在必须编写一个触发器,通过添加新添加的销售额来更新我的办公室表。问题是,并非每个salesrep都有一个分配给他们的办公室。我不明白我是否需要在'FOR EACH ROW'下有一个when子句,以某种方式规定这个,或者如果我需要在我的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是Offices表上列的名称。如果存储过程中使用的名称,则为金额。
答案 0 :(得分:3)
您已被建议在Salesreps上添加谓词,例如WHERE Salesrep = :NEW.Rep
。为什么不将它添加到子查询中?
答案 1 :(得分:1)
使用此触发器方法,您将遇到实施解决方案的各种问题。
只要将订单修改提交到数据库,Office.Sales列值就会变为陈旧。例如,当订单上的价格或数量被更改或删除时。
我建议您将此要求实现为“提交时刷新”物化视图。