2010-04-20 56 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次交付?

觸發器看起來不錯,但他們確實很容易把事情弄糟。

相關問題