2010-04-20 90 views
13

我有两个表创建触发器,更新时,另一个表中的列被更新在一个表中的列

订单(编号,日期,备注)

交货(ID,注意,日期)

我想创建一个触发器,以更新日期在订单中更新的日期。

我当时就想,这样做

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

如何获得日期和行ID?

感谢

回答

14

如何获取日期和行ID?

假设这些都是你叫DELIVERY_DATE ORDER表和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构造来测试是否在Delivery上执行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似乎是它的合乎逻辑的地方。

0

有一个在扳机形式的隐含新老参考: REFERENCING旧如旧新AS 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; 
0

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

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条款。

0

无论何时需要这种触发器,请仔细看看您的设计。是否真的需要一个单独的交付记录?订单是否真的有超过1次交付?

触发器看起来不错,但他们确实很容易把事情弄糟。

相关问题