2010-04-20 25 views
13

Tengo dos tablascrear un disparador que actualiza una columna en una tabla cuando se actualiza una columna de otra tabla

(la identificación, fecha, nota)

y

Entrega (Id, Tenga en cuenta, fecha)

Quiero crear un desencadenador que actualiza la fecha en la entrega cuando la fecha se actualiza en orden.

que estaba pensando hacer algo como

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

¿Cómo llego la fecha y la fila de identificación?

gracias

Respuesta

14

¿Cómo obtengo la identificación de la fecha y la fila?

suponiendo que éstos son columnas en la tabla de orden llamada DELIVERY_DATE y el ID de su disparador debe ser algo como esto:

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; 

Nota de la cláusula FOR EACH ROW: que es necesario para los valores de referencia de las filas individuales. He utilizado una construcción IF para probar si ejecutar la ACTUALIZACIÓN en la entrega. Si no tiene otra lógica en su gatillo se podría escribir así ...

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; 

he respondido a la pregunta que hizo, pero, como un aparte, voy a señalar que el modelo de datos es subóptimo. Un diseño correctamente normalizado contendría el DELIVERY_DATE en una sola mesa: ENTREGA parece el lugar lógico para ello.

0

Hay una referencia nueva y vieja implícita en el gatillo en forma de: REFERENCIAS ANTIGUA COMO VIEJO NUEVO COMO NUEVO

Puede escribir en el: nuevo valor, pero no a el: VIEJO valor

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; 

Plantilla:

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

Use la nueva variable se unen y ancianos. VIEJO hace referencia a la fila o columna que se está actualizando antes de realizar el cambio; NUEVO lo referencia después del cambio.

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; 

Puede modificar la cláusula REFERENCING para dar a sus variables se unen diferentes nombres. Usted puede incluir OLD as <name> también. Ejemplo:

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

Si no desea cambiar los nombres predeterminados de "viejo" y "nuevo", puede dejar de lado la cláusula REFERENCING por completo.

0

Siempre que haya una necesidad de este tipo de activador, eche un buen vistazo a su diseño. ¿Existe realmente la necesidad de un registro de entrega por separado?¿Una orden realmente tiene más de 1 entrega?

Los disparadores parecen agradables pero tienden a ensuciar las cosas bastante rápido.

Cuestiones relacionadas