【发布时间】:2011-04-05 21:35:49
【问题描述】:
我在编写第二个触发器时遇到了问题:
我刚刚编写了一个存储过程和存储函数,用于在我的 Orders 表中插入一个新行。行更新插入:Ordernum、OrderDate、Customer、Rep、Manufacturer、Product、Qty 和 SaleAmount。
我现在必须编写一个触发器,通过添加新添加的销售额来更新我的 Offices 表。问题是,并不是每个销售代表都有一个办公室分配给他们。我不明白我是否需要在“FOR EACH ROW”下有一个 when 子句以某种方式规定这一点,或者我是否需要在我的 SET 销售行之后规定。到目前为止,这是我的代码,但不幸的是,它更新了所有办公室的销售,而不仅仅是 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 表中列的名称。金额,如果在存储过程中使用的名称。
【问题讨论】:
-
听起来您的数据库设计已关闭 imo,您不应该在 office 表中维护聚合(无论是通过触发器还是任何其他措施)。将表格保存在 3NF 中并添加视图/mat 视图(或滚动数据集市)以进行汇总/聚合等。