Ver Mensaje Individual
  #8 (permalink)  
Antiguo 23/05/2010, 12:50
Avatar de xf_corp
xf_corp
 
Fecha de Ingreso: mayo-2008
Mensajes: 57
Antigüedad: 16 años
Puntos: 3
Respuesta: Problemas con triggers

Hola de nuevo jamejilla,

Mira:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/exception_definition.htm:

An exception is a runtime error or warning condition, which can be predefined or user-defined.Predefined exceptions are raised implicitly (automatically) by the runtime system. User-defined exceptions must be raised explicitly by RAISE statements.

Como menciona jc3000, el que veas el mensaje de error es lógico y normal.

La razón por la cual cuando lanzas la excepción se impide el insert de la tupla es la siguiente:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

"If a predefined or user-defined error condition or exception is raised during the execution of a trigger body, then all effects of the trigger body, as well as the triggering statement, are rolled back (unless the error is trapped by an exception handler). Therefore, a trigger body can prevent the execution of the triggering statement by raising an exception. User-defined exceptions are commonly used in triggers that enforce complex security authorizations or integrity constraints."

"unless the error is trapped by an exception handler"


Basicamente estas definiendo un mensaje de error al crear tu excepcion, por lo que comentaba con anterioridad que si solo requerías desplegar el mensaje de error debieses emplear dbms_output, si estas usando sqlplus por ejemplo, utiliza SET SERVEROUTPUT ON para habilitar la salida.

Puedes encontrar más info aquí:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_output.htm

O en español:
http://es.wikipedia.org/wiki/PL/SQL

En tal caso si solo requieres el desplegar el mensaje y no deseas que la excepcion se dispare generando el error, puedes manipularla dentro del bloque EXCEPTION, manejar el trigger como AFTER y eliminar la tupla insertada.


CREATE TRIGGER controlExclusión
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...
delete from escribe where id_modelo=:new.id_modelo and campoUnico=:new.campoUnico;
END;
/

Sabes me da curiosidad, en base a tu select:

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

Si la modelo se encuentra en la tabla revistas quiere decir que es directora?. Simple curiosidad.

Espero que los comentarios te sean útiles.

Saludos.