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

Otro trigger

Estas en el tema de Otro trigger en el foro de Mysql en Foros del Web. En esta ocasión he decidido crearme un trigger que directamente me compruebe si los datos insertados están o no en la tabla solicitada. Alguien puede ...
  #1 (permalink)  
Antiguo 18/05/2012, 16:01
 
Fecha de Ingreso: septiembre-2009
Mensajes: 38
Antigüedad: 14 años, 7 meses
Puntos: 0
Otro trigger

En esta ocasión he decidido crearme un trigger que directamente me compruebe si los datos insertados están o no en la tabla solicitada. Alguien puede echarme una mano haber donde está el errror??

CREATE TRIGGER comprobar
BEFORE INSERT ON alumno
FOR EACH ROW
BEGIN
IF ((SELECT COUNT(*) FROM alumno WHERE nombre = new.nombre and edad=new.edad)<>0)THEN
insert into alumno values (new.idalumno, new.nombre, new.edad)
END IF;
END;

Según mysql el error está near end if

Gracias
  #2 (permalink)  
Antiguo 18/05/2012, 18:27
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, 5 meses
Puntos: 2658
Respuesta: Otro trigger

Primero: No dupliques temas. Ya habías abierto otro para este asunto (Trigger before insert).

Segundo: No se puede hacer una operación DML (INSERT/UPDATE/DELETE) dentro de un trigger, contra la misma tabla que posee el trigger. La tabla está bloqueada para escritura, por lo que no funcionará.
Esto tiene su razón de ser: Si un trigger es invocado en el INSERT y hace un INSERT a la misma tabla, ese segundo disparará otra vez el trigger, que a su vez intentará insertar los datos... y así hasta el infinito. ¿Se comprende?

Tercero: En MySQL los triggers no son opcionales, lo que significa que no puedes detener su ejecución. Entonces no podrías hacer algo que apruebe o no la operación, por lo que si lo enviaste a insertar, lo intentará o fallará.

Cuarto: Es absurdo usar un trigger para validar la misma operación que lo dispara. Las validaciones se hacen antes de intentar insertar. No durante el INSERT.
No tiene ningún sentido intentar la operación si los datos no han sido verificado, es una pésima práctica.
Toda validación de datos se hace en la aplicación y consultando a la base, pero cuando se envía a insertar, es terminal. No debe agregar ninguna validación más.
Es muy propio de programadores tratar de darle a la base esas responsabilidades, simplemente para no tener que hacer lo que deben en la aplicación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/05/2012, 02:27
 
Fecha de Ingreso: septiembre-2009
Mensajes: 38
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Otro trigger

Entonces, no existe ninguna posibilidad dentro de mysql para comprobar si un dato está en una tabla antes de insertarlo?? Lo tengo que hacer a nivel de aplicación??

Un saludo y gracias
planets
  #4 (permalink)  
Antiguo 19/05/2012, 07:09
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, 5 meses
Puntos: 2658
Respuesta: Otro trigger

Existe la posibilidad de hacer eso con procedimientos almacenados (stored procedures), pero en definitiva terminas programando el mismo tipo de rutinas que harías en la aplicación, con una ENORME desventaja: el PL/SQL es más limitado que un lenguaje de programación. Tiene menos recursos, funciones y métodos que cualquier lenguaje, porque el SQL no es un lenguaje de programación, es un lenguaje de consultas.
Ten claro esto: Los SP se usan especialmente para:
- Manejar lecturas de datos muy grandes fuera de la aplicación.
- Asegurar que un error de aplicación no genere problemas de consistencia e integridad de los datos.
- Simplificar la programación de la capa de datos (DAC) de una aplicación.
- Aumentar la seguridad de la base de datos (son invulnerables a sql-injection).

Pero cuando se usan correctamente lo que haces es crear funciones específicas que permitan validar datos puntuales, no inserciones completas, ya que la validación primaria se hace siempre en la aplicación con los recursos provistos por el DAC.
¿ALguna vez has visto una aplicación en la Web donde luego de llenar toooodos los datos, te permita enviar directamente a registración?
No. Y cuando eso parece ocurrir, lo que hace (si analizas la aplicación) es que envía alguno de los datos críticos primero, como por ejemplo el username. Pero jamás regresa validando los otros datos.
¿Se comprende?
Imagínate una aplicación de alta concurrencia, con decenas de miles de entradas / hora. ¿Te parece de buena performance que en cada INSERT sea la base la que tenga que validar miles de inserciones por segundo? No, ni aunque sólo fuesen diez por hora. No es buena práctica.

Lo que se hace en las aplicaciones es reducir la cantidad de datos que el usuario debe poner manualmente (¿alguna vez lo notaste?), y los datos críticos se toman de la base y se colocan en combos de selección, o RadioButtons, CheckBox y otros, de modo que los datos a validar sean precisamente... pocos. Y el resto que sean responsabilidad del usuario.

No busques atajos. Por experiencia te digo que programar las validaciones es la parte más tediosa y hartante de una aplicación, pero cuando lo has hecho, verás que las cosas corren como seda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 20/05/2012, 07:03
 
Fecha de Ingreso: mayo-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Otro trigger

Hola de nuevo planets,

Como dice gnzsoloyo, no dupliques temas. Te he respondido en el otro tema, lo que podrías hacer es un trigger que no te deje insertar datos cuando coincidan con los de la tabla. Y tienes un ejemplo.

Lo que no se puede hacer es un trigger que te los inserte si no coinciden y que te los bloquee si coinciden. En apariencia es lo mismo pero (como ya ha comentado gnzsoloyo) hay restricciones durante la ejecución de triggers o funciones que no te permiten hacer según que cosas.

¡Un saludo!

Etiquetas: select, sql, tabla, trigger
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 01:34.