创建一个触发器,在更新另一个表中的列时更新一个表上的列

时间:2010-04-20 19:41:23

标签: sql oracle triggers

我有两张桌子

订单(身份证明,日期,备注)

交货(同上,注,日期)

我想创建一个触发器,在订单更新日期时更新交货日期。

我正在考虑做类似

的事情
CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE
ON Order
DECLARE
BEGIN
   UPDATE Delivery set date = ??? where id = ???
END;

如何获取日期和行ID?

感谢

4 个答案:

答案 0 :(得分:16)

  

如何获取日期和行ID?

假设这些是您的ORDER表上名为DELIVERY_DATE和ID的列,您的触发器应如下所示:

CREATE OR REPLACE TRIGGER your_trigger_name
    BEFORE UPDATE ON Order
    FOR EACH ROW 
BEGIN
   if :new.delivery_date != :old.delivery_date
   then
       UPDATE Delivery d
       set d.delivery_date = :new.delivery_date
       where d.order_id = :new.id;
    end if;
END;

请注意FOR EACH ROW子句:引用各行的值是必需的。我使用IF构造来测试是否在交付时执行UPDATE。如果您的触发器中没有其他逻辑,您可以像这样编写它......

CREATE OR REPLACE TRIGGER your_trigger_name
    BEFORE UPDATE OF delivery_date ON Order
    FOR EACH ROW 
BEGIN
   UPDATE Delivery d
   set d.delivery_date = :new.delivery_date
   where d.order_id = :new.id;
END;

我已经回答了你提出的问题但是,除此之外,我会指出你的数据模型是次优的。正确规范化的设计只能在一个表上保存DELIVERY_DATE:DELIVERY似乎是合乎逻辑的地方。

答案 1 :(得分:0)

触发器中有一个隐含的新旧引用,其形式为: 将旧的推荐为新的

您可以写入:NEW值,但不能写入:OLD值。

UPDATE Delivery set date = :new.delivery_date where id = :new.id;


CREATE OR REPLACE TRIGGER "BUR_TABLENAME" BEFORE
UPDATE ON "TABLE" FOR EACH ROW
BEGIN
  If :new.active_date is not null Then
    :new.active_date := TRUNC(:new.active_date);
End If;
END;

<强>模板:

CREATE OR REPLACE TRIGGER TRIGGER_NAME
 BEFORE
 UPDATE
 ON TABLE_NAME
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
DECLARE
   V_VARIABLE   NUMBER (1);
BEGIN
   //Do Stuff;
  null;
end;

答案 2 :(得分:0)

使用OLD和NEW绑定变量。 OLD引用在更改之前更新的行或列;更新后新的引用它。

CREATE OR REPLACE TRIGGER trig1
    BEFORE UPDATE
    ON order  REFERENCING NEW AS new
    FOR EACH ROW
BEGIN
    UPDATE delivery
       SET ddate   = :new.ddate
     WHERE id = :new.id;
END;

您可以修改REFERENCING子句,为绑定变量赋予不同的名称。您也可以添加OLD as <name>。例如:

CREATE OR REPLACE TRIGGER trig1
    BEFORE UPDATE
    ON order REFERENCING OLD AS old_values NEW AS new_values
    ...

如果您不想更改“旧”和“新”的默认名称,则可以完全省略REFERENCING子句。

答案 3 :(得分:0)

每当需要这种触发器时,请仔细查看您的设计。是否真的需要单独的交付记录?订单真的有超过1次交货吗?

触发器似乎很好但是它们确实很容易搞砸了。