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.