Ver Mensaje Individual
  #6 (permalink)  
Antiguo 27/08/2009, 05:46
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 4 meses
Puntos: 2655
Respuesta: como hacer exception en trigger??? phpmyadmin, excepciones

Cita:
Iniciado por almirante Ver Mensaje
hola,
llevo un rato buscando por internet y por el foro y no encuentro nada,

COMO HAGO UN EXCEPTION EN UN TRIGGER???

lo único que quiero que haga esque si entra en un if en el trigger, no inserte y devuelva un mensaje.

esto es lo que tengo:

delimiter &&
CREATE TRIGGER rango before INSERT ON nivel
FOR each ROW
BEGIN
if (new.min_anos>=min_anos and new.min_anos<max_anos )
OR ( new.max_anos>min_anos and new.max_anos<=max_anos )
OR ( new.max_anos>max.anos and new.min_anos<max.anos )
then
RAISE EXCEPTION "PETA LOS RANGOOOOOOOOOOOOOOOOS"; ¿¿¿CORRECTO???
end if;
END ;
Vamos por partes:
1. Una Exception es en definitiva un ERROR, y es la denominación que se le da en lenguajes de programación de aplicaciones. No en SQL. En MySQL, al menos en SP, Trigger o Functions se denominan Error.
2. Si se trata de producir un error, es simple. Si se trata de CONTROLAR un error, se debe recurrir a HANDLERs, que son los que permiten capturar estados de excepción (SQLSTATE) o error en los scripts (no en las sentencias manuales o enviadas por aplicaciones).
3. Un TRIGGER es un procedimiento que se dispara antes uno de tres eventos (inserción, actualización o borrado) que se realiza contra una tabla. Sólo existe en tanto la sentencia se ejecuta y no devuelve datos o mensajes.
4. Como los trigger operan sobre datos entrantes, eso significa que solamente tienen por entrada de datos los valores del registro, el actual o el nuevo, que produce el evento. Eso significa que no no puede recibir valores extraños a la tabla, ni parámetros adicionales, porque la primera validación que hace es a nivel de restricciones de tabla (valores, campos, tipos, etc).
5. Los trigger no pueden realizar tareas contra su propia tabla ni contra tablas cuyos trigger generen eventos contra su tabla (circularidad).

Dicho esto, existen tres formas de encarar tu problema, al menos hasta lo que yo entiendo:
1) Variables de usuario a nivel base de datos.
2) Tablas de transacción.
3) Stored procedures invocados en el trigger.

Las variables de usuario se definen con su propia invocación. y permaneces "vivas" mientras la conexión exista,ya que existen en ella.
En esa forma, luego de ejecutar el trigger puedes consultar el estado de la variable. Según lo que contenga, será el estado:

Código sql:
Ver original
  1. DELIMITER&&
  2. CREATE TRIGGER rango BEFORE INSERT ON nivel
  3. FOR each ROW
  4. BEGIN
  5.   IF (NEW.min_anos>=@MAXIMO AND NEW.min_anos < @MINIMO )
  6.       OR ( NEW.max_anos>@MINIMO AND NEW.max_anos <= @MAXIMO )
  7.       OR ( NEW.max_anos>@MAXIMO AND NEW.min_anos < @MAXIMO )
  8.   THEN
  9.     SET @VARERROR = 'NO RESPETA LOS RANGOS';
  10.    END IF;
  11. END ;
  12. DELIMITER ;

Este ejemplo requiere que se carguen previamente las dos variables de comparación (@MAXIMO y @MINIMO), o de lo contrario los valores deberán ser constantes o comparados contra una tabla.

El segundo caso, requiere que se use una tabla adicional para guardar el estado de los errores:
Código sql:
Ver original
  1. DELIMITER&&
  2. CREATE TRIGGER rango BEFORE INSERT ON nivel
  3. FOR each ROW
  4. BEGIN
  5.   IF (NEW.min_anos>=@MAXIMO AND NEW.min_anos < @MINIMO )
  6.       OR ( NEW.max_anos>@MINIMO AND NEW.max_anos <= @MAXIMO )
  7.       OR ( NEW.max_anos>@MAXIMO AND NEW.min_anos < @MAXIMO )
  8.   THEN
  9.     /* puede tener o incluir más valores a almacenar. Eso dependerá de ti.*/
  10.     INSERT INTO ERRORES(MENSAJE) VALUES('NO RESPETA LOS RANGOS');
  11.    END IF;
  12. END ;
  13. DELIMITER ;

El tercer caso usa cualquiera de las dos variantes, pero programadas dentro de un SP que sea invocado por el TRIGGER.

En cualquier caso, el ejemplo que estás dando es irracional, porque esa validación no corresponde a una base de datos, sino que se debe realizar en la aplicación.
No hay que hacer que una base realice la tarea del programa que la usa.
Los triggers se idearon para otros usos, no para suplir la ociosidad de los programadores, por lo que el ejemplo de tu profesor carece de sentido si lo analizas bien.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)