Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Estas en el tema de Inducir la falla de un trigger. (Si se puede devolver un error mejor) en el foro de Mysql en Foros del Web. Hola gente que tal? invoco vuestro conocimiento, estoy haciendo un experimento, quiero usar mysql para validad datos mediante los trigger. Explico, planteo el problema y ...
  #1 (permalink)  
Antiguo 28/12/2013, 08:12
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Hola gente que tal? invoco vuestro conocimiento, estoy haciendo un experimento, quiero usar mysql para validad datos mediante los trigger.
Explico, planteo el problema y pongo el codigo que tengo.

Explicacion: Tengo 3 tablas, usuarios, muros, mensajes.
usuarios:
id_usuario | id_muro | otros_campos
mensajes:
id_mensaje | id_usuario | id_muro | otros_campos
muros:
id_muro | otros_campos

un usuario, puede ir conectandose a diferentes muros, salir de uno, entrar en otro o no estar en ninguno, cuando lo hace voy actualizando el id_muro del usuario para saber en que muro esta actualmente.

el usuario solo puede enviar mensajes al muro que esta actualmente conectado, es decir que si intenta mandar un mensaje a un muro y no esta conectado no deberia poder.

Problema:
Tengo un trigger before insert en la tabla mensajes, lo que quiero hacer es validar dentro del trigger si el tipo esta habilitado y sino, hacer explotar la consulta.
Logre que explote haciendo uso de un "bug" de mysql pero si en el futuro lo arreglan esta tecnica va a dejar de funcar, por lo que quiero algo que sea para esto si es que lo hay.

Codigo del trigger before insert de mensajes:

Código MySQL:
Ver original
  1. DECLARE muro_actual INT;
  2. SELECT id_mural INTO muro_actual FROM usuarios WHERE id_usuario = NEW.id_usuario;
  3.    IF(NEW.id_mural != id_mural) THEN
  4.         -- Con este set el trigger exlota al no ocurrir la validacion.
  5.         -- no se porque mysql permite poner el nombre de una variable no declarada
  6.         -- supongo que es algun bug del parsing o algo
  7.         -- pero aca me gustaria hacer explotar la consulta
  8.     SET NEW.id_mural = variable_salvaje_aparece;
  9.    END IF;

Seria genial poder devolver algun codigo de error personalizado o algun texto mezclado con el error de mysql que despues pueda parsear o algo asi como para saber porque fallo, si es por la validacion o por otro error en los datos
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 28/12/2013, 08:50
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Googleando encontre esto: http://www.brokenbuild.com/blog/2006...ith-a-trigger/ pero no logro entender como funca (ni como hacerlo funcar)
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 28/12/2013, 09:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Cita:
un usuario, puede ir conectandose a diferentes muros, salir de uno, entrar en otro o no estar en ninguno, cuando lo hace voy actualizando el id_muro del usuario para saber en que muro esta actualmente.
Eso se hace habitualmente en la sesión de la aplicación, no necesariamente en la base (aunque usar una tabla de log de conexiones no es una mala idea del todo).
No es conveniente hacerlo en la base por el riesgo de errores ante fallos de conexión imprevistos. No te olvides nunca que en web estás usando un sistema de enlace asíncrono, y por consecuencia los fallos son probables.
Cita:
el usuario solo puede enviar mensajes al muro que esta actualmente conectado, es decir que si intenta mandar un mensaje a un muro y no esta conectado no deberia poder.
Si manejas el almacenamiento de los mensajes por medio de stored procedures, puedes hacer todas las validaciones necesarias sin necesidad de recursos extra. En estos SP puedes implementar toda la lógica necesaria sin tener que recurrir a TRIGGERs, que en un sistema de alto nivel de inserciones puede ser contraproducente.
Cita:
Logre que explote haciendo uso de un "bug" de mysql pero si en el futuro lo arreglan esta tecnica va a dejar de funcar, por lo que quiero algo que sea para esto si es que lo hay.
Usar bugs como recurso de solución es una pésima idea (además de innecesaria), primero porque no puedes confiar en que no desaparezcan, como ya lo sabes. Y tampoco puedes confiar en que lo que diseñas en tu PC sea funcional en el servidor, si este no depende exclusivamente de ti. Bien podría tener versiones anteriores (con consecuencias desastrosas), o posteriores (donde no funcione).
Además, usar un bug bien podría tener efectos secundarios imprevisibles. ¿No te parece? Porque en definitiva estás usando un error de programación como solución.
A mí no me parece muy sensato.

Aún así, si quieres insistir con generar un fallo en el TRIGGER, mi recomendación es que leas con detenimiento el tema de SIGNAL en el manual de referencia, porque es el único método que te servirá.
http://dev.mysql.com/doc/refman/5.5/en/signal.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 28/12/2013, 09:35
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Hola gonzaloyo, gracias como ciempre por compartir tu sabiduria, las conexiones a los muros no las puedo manejar por una session, no son muros como los de un foro a los que un usuario va cambiando constantemente, un usuario cambia de muro (como mucho) una vez por dia, y este puede estar conectado a un muro, desconectarse de internet, pero los demas usuarios de ese muro deben saber quien esta o quien estubo. es medio complejo de explicar el objetivo de hacerlo asi, digamos que soluciona muchos problemas.


Cita:
En estos SP puedes implementar toda la lógica necesaria sin tener que recurrir a TRIGGERs, que en un sistema de alto nivel de inserciones puede ser contraproducente.
de hecho, este sistema va a tener un altisimo nivel de inserciones (cientos/miles por minuto) asi que esto tendria que ser lo mas eficiente posible, pense que un trigger era mas rapido que un SP pero de no ser asi ¿como puedo implementar una insercion con un SP?

Cita:
A mí no me parece muy sensato.
A mi tampoco, por eso pregunte por una solucion menos salvaje jaja
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 28/12/2013, 09:51
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Otra cosa ya que estamos, este es el ejemplo del manual:

Código MySQL:
Ver original
  1.   DECLARE specialty CONDITION FOR SQLSTATE '45000';
  2.   IF pval = 0 THEN
  3.     SIGNAL SQLSTATE '01000';
  4.   ELSEIF pval = 1 THEN
  5.     SIGNAL SQLSTATE '45000'
  6.       SET MESSAGE_TEXT = 'An error occurred';
  7.   ELSEIF pval = 2 THEN
  8.     SIGNAL specialty
  9.       SET MESSAGE_TEXT = 'An error occurred';
  10.   ELSE
  11.     SIGNAL SQLSTATE '01000'
  12.       SET MESSAGE_TEXT = 'A warning occurred', MYSQL_ERRNO = 1000;
  13.     SIGNAL SQLSTATE '45000'
  14.       SET MESSAGE_TEXT = 'An error occurred', MYSQL_ERRNO = 1001;
  15.   END IF;

podrias explicarme que diferencia hay entre lanzar una exepcion por el valor 1 y por el valor 2 ademas de usar una variable? osea ventajas/contras de usar uno u otro metodo?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 28/12/2013, 11:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Cuando el valor es 1 estás definiendo un error personalizado de usuario:
Cita:
To signal a generic SQLSTATE value, use '45000', which means “unhandled user-defined exception.”
Se dispararía ante cualquier excepción o condición no contemplada en el maneo de errores estandar de MySQL.
En el caso 0, se refiere a este error:
Cita:
Error: 1249 SQLSTATE: 01000 (ER_SELECT_REDUCED)
Mensaje: Select %u fué reducido durante optimización
donde "%u" es reemplazado por MySQL por el valor del select que el parser reemplazó.

Pero de todos modos toda al explicación de ese ejemplo la tienes en el mismo capitulo del manual de referencia...
¿Se te dificulta el inglés técnico?

Por cierto, para implementar SP, ¿cuánta práctica tienes en ellos?
En principio no debería ser mu complicado, porque simpemente las validaciones e inserciones que piensas hacer en el TRIGGER las pones en el SP, y procedes en consecuencia. Incluso puedes poner parámetros de retorno para obtener codigos personalizados de error y mensajes adecuados, sin tener que meterte a provocar excepciones.
Los TRIGGERs no son una forma adecuada porque al ejecutarse todas las veces que hagas un INSERT, en un sistema de alto impacto de ABM, afecta la performance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 28/12/2013 a las 12:27
  #7 (permalink)  
Antiguo 28/12/2013, 13:32
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Cita:
¿Tienes problemas para leer inglés técnico?
No me agrada pero no tengo inconvenientes.

De todas formas la pregunta era entre el caso 1 el 2, no entre el 1 y el 0.

el 1 y el 2 hacen lo mismo pero el 2 involucra una variable, la pregunta era que ventajas/contras habia entre una y otra forma.

¿Es posible usar la misma variable en varios errores? ¿o reusarla? ¿o preguntar si esta activada? por lo que entendi signal detiene la ejecucion y el error se procesa de forma inmediata por lo que no entiendo que ventaja tiene usar una variable
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #8 (permalink)  
Antiguo 28/12/2013, 14:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Cita:
¿Es posible usar la misma variable en varios errores? ¿o reusarla? ¿o preguntar si esta activada? por lo que entendi signal detiene la ejecucion y el error se procesa de forma inmediata por lo que no entiendo que ventaja tiene usar una variable
En ese caso 1 y 2 hacen lo mismo en cuanto a SQLSTATE se trata, por lo que en realidad habría que ver el contexto del error para entender cuál es el objetivo.
Por otro, nada impide que una misma variable aplique a N eventos diferentes. Eso tiene más relación con la lógica que se quiere implementar. Además, no te olvides que ese es un ejemplo. Lo importante es lo que tu mismo desarrolles.
La importancia del uso de una variable tiene que ver con muchas cosas, como por ejemplo si dentro de una condicion del IF desarrollas una acción que pueda disparar un fallo distinto, al que quieres personalizar a su vez, sin necesidad de declarar nuevas variables (que por otro lado no se necesitan).
No te distraigas por la forma en que se hacen las cosas. Lo que debes analizar es el fondo, la razón por la que se hacen las cosas así y en qué contexto se presentan los casos.
En otras palabras, debes revisar el escenario. El SIGNAL es sólo una herramienta que puede tener un uso flexible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/12/2013, 15:01
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)

Buenisimo, gracias por la explicacion, voy a arrancar a hacer algo y si me trabo pregunto. Saludos que pases bien las fiestas!
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #10 (permalink)  
Antiguo 28/12/2013, 15:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inducir la falla de un trigger. (Si se puede devolver un error mejor)



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, devolver, falla, select, sql, tabla, trigger, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:51.