2010-04-20 7 views
13

ho due tabelleCreare un trigger che aggiorna una colonna su una tabella quando una colonna in un'altra tabella viene aggiornata

Order (id, data, appunto)

e

consegna (Id, Nota, Data)

Desidero creare un trigger che aggiorni la data in Consegna quando la data viene aggiornata in Ordine.

Stavo pensando di fare qualcosa di simile

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

Come faccio ad avere la data e l'id di fila?

grazie

risposta

14

Come ottengo la data e l'ID di riga?

presupponendo che siano colonne sul vostro tavolo ordine chiamato DELIVERY_DATE e ID il trigger dovrebbe essere simile a questo:

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; 

Annotare la clausola FOR EACH ROW: che è necessario per valori di riferimento da singole righe. Ho usato un costrutto IF per testare se eseguire l'UPDATE alla consegna. Se non avete altra logica nel vostro grilletto si potrebbe scrivere in questo modo ...

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; 

ho risposto alla domanda che hai chiesto, ma, come un a parte, vorrei far notare che il vostro modello di dati è sub-ottimale. Un design correttamente normalizzato potrebbe contenere DELIVERY_DATE su una sola tabella: DELIVERY sembra il posto logico per esso.

0

C'è un nuovo e vecchio riferimento implicito nel trigger sotto forma di: REFERENCING VECCHIO COME VECCHIO NUOVO COME NUOVO

È possibile scrivere al: nuovo valore, ma non per il: valore 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; 

Template:

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

utilizzare il vecchio e variabili bind NUOVE. OLD fa riferimento alla riga o alla colonna che viene aggiornata prima che venga apportata la modifica; NEW lo riferisce dopo il cambiamento.

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; 

È possibile modificare la clausola REFERENCING per dare le variabili bind nomi diversi. Puoi includere anche OLD as <name>. Esempio:

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

Se non si desidera modificare i nomi predefiniti di "vecchio" e "nuovo", si può tralasciare la clausola REFERENCING completamente.

0

Ogni volta che è necessario questo tipo di trigger, dare un'occhiata al proprio design. È davvero necessario un record di consegna separato?Un ordine ha davvero più di 1 consegna?

I trigger sembrano buoni, ma tendono a rovinare le cose abbastanza rapidamente.