Crear Triggers

Tengo una tabla de 5 campos, a la que le agregue dos campos adicionales, uno de los campos se le debe insertar una secuencia que funguirá como PORQUE y el segundo campo se le debe insertar la fecha, ahora bien explico mi inconveniente, no puedo crear un trigger con la condición "AFTER INSERT" porque me da error de tabla mutante, esto es debido a que la tabla la tabla recibe UPDATE todo el día a cada instante.
No puedo crear un trigger con la condición "INSTEAD OF INSERT" porque no se puede utilizar en tablas sólo en vistas, y no me sirve de esta forma porque cuando los datos vengan de la aplicación a la base de datos (ORACLE 9i) me dará error por la falta de los 2 campos adicionaes que cree. Le coloco la estructura del trigger
CREATE OR REPLACE TRIGGER MI_TRIGGER
[AFTER/INSTEAD OF] INSERT ON MI_TABLA
FOR EACH ROW
BEGIN
INSERT INTO ESQUEMA.MI_TABLA
(Campo1, campo2, campo3, campo4, campo5, campo6, campo7)
values(
:NEW. CAMPO1,
:NEW. CAMPO2,
:NEW. CAMPO3,
:NEW. CAMPO4,
:NEW. CAMPO5,
MI_SECUENCIA.NEXTVAL,
SYSDATE);
COMMIT;
END MI_TRIGGER;
/

1 Respuesta

Respuesta
1
Si no me equivoco, estas haciendo un insert en un tirgger on insert sobre la misma tabla que dispara el trigger. Esto no tiene mucho sentido. El error de tabla mutante te da porque la ejecución del trigger esta disparando el propio trigger.
Hola ...
Dejame ver si me explico mejor, la aplicación recoge e inserta sobre mi_tabla los datos correspondientes a los primeros 5 campos, así es como esta de manera original la recolección de los datos. Como la tabla no tiene PORQUE agregue dos campos (campo6 y campo7) uno es una secuencia y el otro la fecha, que es lo que requiero que el trigger se dispare cuando se van a insertar los primeros 5 campos recoja los nuevos datos en los .new e inserte además los valores de los campos que añadí.
Gracias !
Si la aplicación inserta los 5 primeros campos y dispara el trigger on insert solo tienes que poner los valores de los campos que la aplicación no actualiza. Si no he entendido mal.
Creo que lo que tu quieres hacer es esto:
Create or replace trigger mi_trigger
[AFTER/INSTEAD OF] INSERT ON MI_TABLA
FOR EACH ROW
BEGIN
:new.campo6:=MI_SECUENCIA.NEXTVAL;
:new.campo7:=SYSDATE;
END;
/
Gracias una vez más por atenderme ...
Pero volví a quedar al principio, te explico tu sintaxis o la mía es valida para ingresar los datos, el inconveniente lo tengo es que si utilizo la condición "AFTER on insert" me da error de tabla mutante y no puedo utilizar la condición "Instead of" porque es sólo para vistas. ¿Cómo puedo hacer para insertar esos datos?
Disculpa tantas molestias pero es que no sé que más hacer ...
Cuando te da error de "tabla mutante" es porque estas lanzando una sentencia desde el trigger que dispara el propio trigger, como es el caso en el código que has pegado en tu primera consulta. Si un insert dispara un trigger after o before y dentro del trigger lanzas otro insert que a su vez dispara otra vez el triggers...
El código que mandas podría funcionar par un trigger instead pero no en after, puesto que en los instead se sustituye la sentencia que lo dispara por la del trigger.
El código es más o mentó el que te mandé antes pero con una salvedad que debe ser before en lugar de after para poder modificar las variables :new. En las after solo se pueden leer.
El código sería el siguiente;
CREATE OR REPLACE TRIGGER MI_TRIGGER
before INSERT ON MI_TABLA
FOR EACH ROW
BEGIN
:new.campo6:=MI_SECUENCIA.NEXTVAL;
:new.campo7:=SYSDATE;
END MI_TRIGGER;
Si te sirvió recuerda cerrar el hilo
Primero que nada gracias por la ayuda y el tiempo... aunque aun sigo peleando con mi trigger, ya que no lo puedo colocar con la sentencia before. Agradecida de igual manera!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas