update trigger tabla raise_application_error parametros mutante misma ejercicios ejemplos disparador con campo actualizar 11g oracle triggers

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.