【问题标题】:trigger for when a sale is made to update the despatch table [closed]进行销售以更新发货表时触发[关闭]
【发布时间】:2010-11-22 00:56:36
【问题描述】:

我想知道一旦新的销售被插入到销售表中,我将如何创建一个触发器来更新发货表。我猜代码的前几行应该是这样的:

create trigger sale_trig
after insert of sale_id on sales
.....

但我不知道如何做剩下的。 我正在使用 iSQL Plus。

销售表包括:sale_idsale_pricesale_dateno_of_prodsprod_idcust_iddesp_id。 调度表包括:desp_idshelfLocquantityprod_idprod_name

我猜是因为我在调度表中没有sale_id,所以我需要先添加它并使其成为外键,但我不确定。

编辑

我正在为数据库创建测试数据。他们给我们的模式说,出于某种原因,我们需要在调度表中包含prod_name,但我认为我们只需要将它与prod_id 链接起来。

好吧,也许它没有更新。那么它只是一个新的插入到调度表中吗?我将它用于 iSQL Plus。对于shelfLoc,我们被告知使用随机生成器生成随机字符串。那么我如何将它链接到触发器中呢? (我希望这是有道理的)

【问题讨论】:

  • 您可能会考虑告诉人们您正在使用什么 DBMS,因为触发器差异很大。 MS SQL Server、Oracle、MySQL、Postgres、...?
  • 您为什么不在应用程序本身中执行此操作?为什么要添加触发器?有完成销售的应用程序代码,也可以轻松地将行添加到发货中。为什么要使用触发器?为什么不更新应用程序?
  • 因为一旦完成销售,我必须使用触发器来更新发货表。
  • @taksIV:“这是我必须使用触发器的要求”这是一个非常愚蠢的要求。它显然太复杂了(或者您不会在这里寻求帮助。)您可以建议另一种方法更简单、更便宜、更可靠且不那么复杂。允许“回击”诸如“在应用程序更改更简单的地方使用触发器”这样的愚蠢要求。
  • 我的要求,我的意思是对我正在做的任务的要求。

标签: database oracle triggers insert


【解决方案1】:

我不知道为什么您的 DESPATCH 表有 PROD NAME 列 - 这应该可以通过 PROD ID 在 PRODUCT 上的外键查找得出。它确实需要一个指向 SALES 的链接,否则调度员将如何找到发送它的地址。我还认为它需要一个 DATE_DISPATCHED 列,该列仅在订单邮寄后才会填充。

你没有说你正在使用的数据库。我将使用 Oracle,因为它是我最熟悉的。

create or replace trigger sale_trig 
    after insert on sales for each row
begin
    insert into despatch
      (desp_id
       , shelfLoc
       , quantity
       , prod_id
       , prod_name
       , sales_id)
    values
      (despatch_sequence.nextval
       , dbms_random.string('U', 5)
       , :new.no_of_prods
       , :new.prod_id
       , :new.prod_name
       , :new.sales_id);
end;
/

请注意,由于您没有提供足够的信息,我不得不对您的数据模型做出一些假设:

  1. desp_id 填充了一个序列
  2. shelfloc 通过一些填充 一种查找
  3. sales.no_of_prods 映射到 发货数量

编辑: 在重新标记您的问题时,更新标签让我重新阅读了您的问题。你说你想更新 DESPATCH 表,但我不明白为什么。为什么在下订单之前会有 DESPATCH 记录?那么有什么要更新的呢?

编辑 2:我已经修改了触发代码以反映您的响应。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多