2010-04-20 5 views
13

i deux tablesCréer un déclencheur qui met à jour une colonne sur une table quand une colonne dans une autre table est mise à jour

commande (id, la date, ndlr)

et

Livraison (Id, Note, Date)

Je souhaite créer un déclencheur qui met à jour la date dans Livraison lorsque la date est mise à jour dans l'ordre.

Je pensais faire quelque chose comme

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

Comment puis-je obtenir la date et l'ID ligne?

grâce

Répondre

14

Comment obtenir la date et l'identifiant de ligne?

En supposant que ce sont des colonnes sur votre table ORDER appelé DELIVERY_DATE et l'ID de votre déclencheur devrait ressembler à ceci:

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; 

Notez la clause FOR EACH ROW: ce qui est nécessaire aux valeurs de référence de lignes individuelles. J'ai utilisé une construction IF pour tester si exécuter le UPDATE à la livraison. Si vous avez pas d'autre logique dans votre déclencheur, vous pouvez l'écrire comme ça ...

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; 

J'ai répondu à la question que vous avez posée, mais, en aparté, je ferai remarquer que votre modèle de données est sous-optimal. Un design correctement normalisé devrait contenir DELIVERY_DATE sur une seule table: DELIVERY semble être l'endroit logique pour cela.

0

Il y a une nouvelle et ancienne implicite référence à la détente sous forme de: REFERENCEMENT VIEUX COMME VIEUX NOUVEAU COMME NOUVEAU

Vous pouvez écrire à: nouvelle valeur, mais pas la: VIEILLE valeur.

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; 

Modèle:

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

Utilisez les variables de liaison anciens et nouveaux. OLD référence la ligne ou la colonne en cours de mise à jour avant que la modification ne soit effectuée; De nouvelles références après le changement.

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; 

Vous pouvez modifier la clause REFERENCING pour donner à vos variables de liaison des noms différents. Vous pouvez également inclure OLD as <name>. Exemple:

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

Si vous ne voulez pas changer les noms par défaut des « anciens » et « nouveaux », vous pouvez laisser complètement la clause REFERENCING.

0

Chaque fois que vous avez besoin de ce type de déclencheur, jetez un œil à votre conception. Est-ce qu'il y a vraiment un besoin pour un enregistrement de livraison séparé?Une commande a-t-elle vraiment plus d'une livraison? Les déclencheurs semblent agréables, mais ils ont tendance à gâcher les choses assez rapidement.

Questions connexes