Ver Mensaje Individual
  #11 (permalink)  
Antiguo 24/05/2010, 22:55
Avatar de xf_corp
xf_corp
 
Fecha de Ingreso: mayo-2008
Mensajes: 57
Antigüedad: 16 años, 7 meses
Puntos: 3
Respuesta: Problemas con triggers

Hola, me ha dado curiosidad, sin emabargo se requiere algo mas que la transaccion autonoma, en este caso, podrías darle la vuelta usando un savepoint; lo marcas antes de realizar el insert:
SAVEPOINT start_transaction;

y posteriormente dentro del la transaccion autonoma das el rollback:

ROLLBACK TO start_transaction;

creo que es buen punto de partida, solo tienes que realizar algunas pruebas, y se cuidadoso con el manejo de las excepciones, lo que muestro es solo un ejemplo.


CREATE or replace TRIGGER controlExclusion
AFTER INSERT ON escribe
FOR EACH ROW
DECLARE contador NUMBER := 0;
Modelo_Directora EXCEPTION; --//declara la excepción...
BEGIN

IF :new.id_modelo IS NOT NULL THEN

SELECT COUNT (id_modelo)
INTO contador
FROM revistas
WHERE id_modelo = :new.id_modelo;

IF contador = 1 THEN
RAISE Modelo_Directora; --//dispara la excepción...


END IF;

END IF;
EXCEPTION
WHEN Modelo_Directora THEN
dbms_output.put_line('No puedes asignar una modelo para que escriba en la revista de la cual es directora');
--//sentencias para eliminar la tupla insertada validando que solo remuevas la tupla insertada...
undoInsert(:new.id_modelo,:new.campoUnico);
END;
/


create or replace procedure undoInsert(id number, unico number) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN

delete from escribe where id_modelo=id and campoUnico=unico;
ROLLBACK TO start_transaction;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/


begin
SAVEPOINT start_transaction;

insert into escribe values (2, 2);
insert into escribe values (3, 3);


insert into escribe values (1, 1);
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
/

Espero sea ùtil, ha sido interesante. .

Saludos.