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

Trigger para controlar edad

Estas en el tema de Trigger para controlar edad en el foro de Mysql en Foros del Web. Buenas quisiera saber su experiencia a cerca de los triggers. Que trigger considerian mejor para controlar por ejemplo que las personas ingresadas a una tabla ...
  #1 (permalink)  
Antiguo 12/11/2009, 20:43
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta Trigger para controlar edad

Buenas
quisiera saber su experiencia a cerca de los triggers.
Que trigger considerian mejor para controlar por ejemplo que las personas ingresadas a una tabla x sean mayores de edad? en base a que en dicha tabla se inserta la fecha de nacimiento.

bueno aguardo sus opiniones,
Saludos!!!
  #2 (permalink)  
Antiguo 13/11/2009, 02:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Trigger para controlar edad

Para eso no necesitas ningún trigger, sólo la consulta
Código sql:
Ver original
  1. SELECT *, (TIMESTAMPDIFF(YEAR,campofechanacimiento,curdate()) edad
  2.  FROM tutabla WHERE TIMESTAMPDIFF(YEAR,campofechanacimiento,curdate()) >=18

Creo que así. No he hecho pruebas.

Última edición por jurena; 13/11/2009 a las 06:18
  #3 (permalink)  
Antiguo 13/11/2009, 03:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Trigger para controlar edad

Si lo que quieres es que una persona menor de edad no pueda ingresar... quizás si que se pueda solucionar con triggers... pero podrías evitarlo con programación externa y así evitas trabajos inútiles del servidor...

Es decir si es menor de edad no llegar ni a ejecutar el insert into...

Si lo que quieres es consultar la lista de mayores de edad ya ingresados en la bbdd luego la solución de jurena es más que buena... (tampoco la he probado).

Quim
  #4 (permalink)  
Antiguo 13/11/2009, 04:00
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Trigger para controlar edad

Cita:
Iniciado por jurena Ver Mensaje
Para eso no necesitas ningún trigger, sólo la consulta
Código sql:
Ver original
  1. SELECT *, (TIMESTAMPDIFF(YEAR,campofechanacimiento,curdate()) edad
  2.  FROM tutabla WHERE TIMESTAMPDIFF(MONTH,campofechanacimiento,curdate()) >=18

Creo que así. No he hecho pruebas.

Hola jurena. Gracias por tu interes.

Entiendo tu consulta.pero con ella no lograre evitar que se ingresen empleados menores a 18 años.Solamente consulto por ellos pero no los evitos.
A lo que yo me refiero es a un disparador que actue una vez que por ejemplo intento ingresar una persona que nacio 12/jul/2000. no permiriendome hacerlo.
La idea de controlarlo con trigger es consecuencia que en MySql no andan los Cheks, sino seria mucho mas facil

muchas gracias! Saludos!
  #5 (permalink)  
Antiguo 13/11/2009, 04:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Trigger para controlar edad

Cita:
Iniciado por quimfv Ver Mensaje
Si lo que quieres es que una persona menor de edad no pueda ingresar... quizás si que se pueda solucionar con triggers... pero podrías evitarlo con programación externa y así evitas trabajos inútiles del servidor...

Es decir si es menor de edad no llegar ni a ejecutar el insert into...

Si lo que quieres es consultar la lista de mayores de edad ya ingresados en la bbdd luego la solución de jurena es más que buena... (tampoco la he probado).

Quim
Hola quimfv
gracias por tu interes!
Claro que si es mucho mas conveniente y facil controlarlo con programacion externa,eso es asi de cualquier punto de vista.
pero el tema es que necesito trabajar solamente con MySQL Query Browser y realizar acciones directamente sobre la base de Datos.
coincido con tigo sobre la solucion de jurena. pero como le cite esta consulta no me evita el ingreso de una persona que halla nacido el 21/jul/2000
Muchas gracias
saludos!
  #6 (permalink)  
Antiguo 13/11/2009, 04:22
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: Trigger para controlar edad

Un trigger no te va a evitar que se produzca el ingreso de una persona de menos de 18 años, porque cuando el trigger se dispara la inserción ya se inició, o ya terminó (BEFORE / AFTER). Lo máximo que puedes obtener es algún control adicional a la inserción, pero no evitarla.
Lo que tu quieres no se realiza por TRIGGERs, se controla por STORED PROCEDUREs, y normalmente se hace por programación, ya que nadie hace ingreso de datos por medio de SQL puro... Para eso están los aplicativos programados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 13/11/2009, 06:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Trigger para controlar edad

Perdona, germanrip,
pero creí haber borrado mi post cuando me di cuenta de lo que realmente querías era otra cosa, un control de validación mediante trigger. Además había un error en la consulta, MONTH por YEAR. A mí también me quedó la duda de si un store-procedure que incluyera una función para averiguar los años, y según ese dato el store-procedure lanzara la inserción o no; de hecho empecé a verlo, pero no tengo mucha experiencia con los store-procedures, y, además, luego pensé que eso lo podías hacer tanto con javascript a nivel de cliente, como con sesiones y php, en el caso de que uses ese programa. De hecho no lo probé. Es lo que te dicen quimfv y gnzsoloyo. Seguiremos viendo a ver si somos capaces de montar ese store-procedure.
Por cierto, se me ocurre que tampoco esa consulta para averiguar la edad es la mejor, pues no tiene en cuenta los años bisiestos. Habrá que retocarlo todo un poco.

Saludos.

Última edición por jurena; 13/11/2009 a las 06:42
  #8 (permalink)  
Antiguo 13/11/2009, 08: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: Trigger para controlar edad

Un store procedure que realice la inserción si y sólo si la edad supera la mínima, es relativamente sencillo; y si además se quiere un mensaje de salida, también.
Un modelo esquemático sería:
Código sql:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `IngresarPersona` $$
  3. CREATE PROCEDURE `IngresarPersona` (
  4.   IN VNOMBRE VARCHAR(50),
  5.   IN VAPELLIDO VARCHAR(50),
  6.   IN VFECHA_NAC DATE,
  7.   OUT RESPONSE VARCHAR(50))
  8. BEGIN
  9.  
  10.   IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
  11.     SET RESPONSE = 'EDAD MENOR A LA MINIMA';
  12.   ELSE
  13.     INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
  14.       VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
  15.     SET RESPONSE = 'OK';
  16.   END IF;
  17.  
  18. END $$
  19.  
  20. DELIMITER ;
En la aplicación (dependiendo del lenguaje), se debe recuperar el parámetro de salida o bien, poner como sentencia final un select, para de esa forma recueprar el valor en la misma ejecución:
Código SQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `IngresarPersona` $$
  3. CREATE PROCEDURE `IngresarPersona` (
  4.   IN VNOMBRE VARCHAR(50),
  5.   IN VAPELLIDO VARCHAR(50),
  6.   IN VFECHA_NAC DATE)
  7. BEGIN
  8.   DECLARE RESPONSE VARCHAR(50);
  9.   IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
  10.     SET RESPONSE = 'EDAD MENOR A LA MINIMA';
  11.   ELSE
  12.     INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
  13.       VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
  14.     SET RESPONSE = 'OK';
  15.   END IF;
  16.   SELECT RESPONSE;
  17. END $$
La función TIMESTAMPDIFF es muy eficiente para esto, ya que no tenemos que corroborar nada, solamente indicarle cuál unidad usaremos (YEAR en este caso), y sólo cuando supere valores enteros de un año, sumará uno. Hay que recordar que TIMESTAMPDIFF trabaja con valore DAATETIME, por lo que para evitar problemas de interpretación es conveiente convertir a DATE los valores usados, ya que de esa forma las fechas se recortan a la hora 00:00:00.
Mira esto:
Código SQL:
Ver original
  1. mysql> SELECT
  2.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11', '2010-11-11') FECHA_1,
  3.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 09:59:59') FECHA_2,
  4.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 10:00:01') FECHA_3;
  5. +---------+---------+---------+
  6. | FECHA_1 | FECHA_2 | FECHA_3 |
  7. +---------+---------+---------+
  8. |       1 |       0 |       1 |
  9. +---------+---------+---------+
  10. 1 ROW IN SET (0.00 sec)
  11.  
  12. mysql>
__________________
¿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; 13/11/2009 a las 08:36
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:17.