sql >> Base de Datos >  >> RDS >> Oracle

Error de mutación después del desencadenador de inserción

En Oracle hay dos niveles de activadores:nivel de fila y nivel de tabla.

Los activadores de nivel de fila se ejecutan for each row . Disparadores de nivel de tabla ejecutados por declaración, incluso si una declaración cambió más de una fila.
En un disparador de nivel de fila, no puede seleccionar/actualizar la tabla en sí que tiene el disparador:obtendrá un error de mutación.

En este caso, no hay necesidad de una instrucción UPDATE. Solo prueba esto:

CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
 :new.quote_expiration_date=sysdate+90;     
END;
/

EDITAR Rajesh mencionó que es posible que antes de insertar una nueva fila, OP quiera actualizar todos los demás registros en aso_quote_headers_all mesa.

Bueno, esto es factible, pero es un poco complicado. Para hacer esto correctamente, necesitará

  1. Un paquete pl/sql y una variable en el encabezado del paquete que modifican los disparadores. Esta variable podría ser una lista que contenga los ID de los registros recién insertados. El nivel de fila después del activador de inserción agregaría una nueva ID a la lista. El contenido de esta variable de paquete será diferente para cada sesión diferente, así que llamemos a esta variable session_variable .
  2. Nivel de fila después del activador de inserción, que agregaría una nueva ID a la session_variable .
  3. Nivel de tabla después del activador de inserción que obtendría ID de session_variable , procese el ID y luego elimínelo de la session_variable . Este activador podría ejecutar las selecciones/actualizaciones necesarias en aso_quote_headers_all. Después de que se procese una ID recién insertada, este disparador debe asegurarse de que se elimine de la session_variable .