【问题标题】:One more question regarding triggers PL/SQL关于触发器 PL/SQL 的另一个问题
【发布时间】: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 视图(或滚动数据集市)以进行汇总/聚合等。

标签: database oracle plsql


【解决方案1】:

已建议您在 Salesreps 上添加谓词,例如WHERE Salesrep = :NEW.Rep。为什么不将其添加到子查询中?

【讨论】:

    【解决方案2】:

    使用此触发方法实施解决方案时,您将遇到各种问题。

    一旦订单的修改提交到数据库,Office.Sales 列的值就会失效。例如,当订单上的价格或数量发生更改或删除时。

    我建议您将此要求实现为“提交时刷新”实体化视图。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2017-09-14
      • 1970-01-01
      • 2013-06-03
      • 2020-01-05
      • 2011-07-29
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多