trigger - ORACLE y DISPARADORES(insertados, actualizados, eliminados)
trigger oracle insert (4)
Cambié mi código así y funciona:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR UPDATE OR DELETE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = ''HBP00'' OR old_buffer.field1 = ''HBP00'')
DECLARE
Operation NUMBER;
CustomerCode CHAR(10 BYTE);
BEGIN
IF DELETING THEN
Operation := 3;
CustomerCode := :old_buffer.field1;
END IF;
IF INSERTING THEN
Operation := 1;
CustomerCode := :new_buffer.field1;
END IF;
IF UPDATING THEN
Operation := 2;
CustomerCode := :new_buffer.field1;
END IF;
// DO SOMETHING ...
EXCEPTION
WHEN OTHERS THEN ErrorCode := SQLCODE;
END;
Me gustaría usar un disparador en una tabla que se activará cada vez que se inserte, actualice o elimine una fila.
Escribí algo como esto:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = ''HBP00'')
y funciona. Como me gustaría hacer las mismas cosas si la fila se inserta, actualiza o elimina, me gustaría saber qué está sucediendo en el desencadenador. Creo que puedo encontrar si la fila está insertada o actualizada (puedo verificar el old_buffer con el new_buffer). ¿Cómo puedo saber si la fila ha sido eliminada?
De usar disparadores :
Detectando la operación DML que disparó un disparador
Si más de un tipo de operación DML puede desencadenar un desencadenador (por ejemplo, ON INSERT, SULE o UPDATE OF Emp_tab), el cuerpo desencadenante puede usar los predicados condicionales INSERTING, BORDE y UPDATING para verificar qué tipo de instrucción activa el desencadenador.
Asi que
IF DELETING THEN ... END IF;
debería funcionar para su caso.
Los NUEVOS valores (o NEW_BUFFER como los ha cambiado) solo están disponibles al INSERTAR y ACTUALIZAR. Para BORRAR necesitarás usar OLD (OLD_BUFFER). Entonces tu disparador se convertiría en:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = ''HBP00'' OR old_buffer.field1 = ''HBP00'')
Es posible que necesite agregar lógica dentro del desencadenador para proporcionar un código que actualice el campo 1 de ''HBP000'' a otra cosa.
Separarlo en 2 disparadores. Uno para la eliminación y otro para la inserción / actualización.