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

AYUDA Trigger mysql

Estas en el tema de AYUDA Trigger mysql en el foro de Mysql en Foros del Web. Muy buenas. Estoy trabajando con sugarcrm y hay cosas que las hago directamente en base de datos. Mi duda viene cuando intento crear un trigger ...
  #1 (permalink)  
Antiguo 17/11/2010, 09:05
 
Fecha de Ingreso: abril-2004
Ubicación: Aranjuez
Mensajes: 8
Antigüedad: 20 años
Puntos: 0
AYUDA Trigger mysql

Muy buenas. Estoy trabajando con sugarcrm y hay cosas que las hago directamente en base de datos.
Mi duda viene cuando intento crear un trigger en mysql 5.1 y me da el error 1064.
El codigo es el siguiente y no sé que es lo que tengo mal.
Código:
CREATE TRIGGER ACT_CENTROS AFTER INSERT on sugartest.citas_citas_nominales
FOR EACH ROW
BEGIN

DECLARE cur1 CURSOR for select id_centro from sugartest.citas_citas_nominales group by id_centro;
DECLARE	ausencias,citas_totales_centro,asistencias INT(10); 

for centros in cur1
ausencias:=select count(*) from sugartest.citas_citas_nominales where estado='Ausencia' and id_centro=centros.id_centro;citas_totales_centro:=select count(*) from sugartest.citas_citas_nominales where id_centro=centros.id_centro;
asistencias:=citas_totales_centro-ausencias;
update sugartest.citas_centros set num_ausencias=ausencias,num_citas_totales=citas_totales,num_asistencias=asistencias where citas_centros.id=centros.id_centro;

end loop;

END;
Lo que quiero haces es cada vez que se inserte un registro en la tabla1 se actualice en la tabla2 otros valores.

Qué tengo mal y qué puede estar ocurriendo?
  #2 (permalink)  
Antiguo 17/11/2010, 09:15
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: AYUDA Trigger mysql

El error 1064 es un error de sintaxis.

Postea todo el error para ver en que parte se cae.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 17/11/2010, 09:24
 
Fecha de Ingreso: abril-2004
Ubicación: Aranjuez
Mensajes: 8
Antigüedad: 20 años
Puntos: 0
Respuesta: AYUDA Trigger mysql

Error

consulta SQL: Documentación

CREATE TRIGGER ACT_CENTROS AFTER INSERT ON sugartest.citas_citas_nominales
FOR EACH
ROW
BEGIN DECLARE cur1 CURSOR
FOR SELECT id_centro
FROM sugartest.citas_citas_nominales
GROUP BY id_centro;

MySQL ha dicho: Documentación
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
  #4 (permalink)  
Antiguo 17/11/2010, 09:31
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: AYUDA Trigger mysql

¿Qué estás usando par crearlo?
¿phpMyAdmin, MySQL Workbench, Navicat...?
__________________
¿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 17/11/2010, 09:33
 
Fecha de Ingreso: abril-2004
Ubicación: Aranjuez
Mensajes: 8
Antigüedad: 20 años
Puntos: 0
Respuesta: AYUDA Trigger mysql

Perdona que no me haya explicado.

Estoy usando phpmyadmin 3.2.4 y mysql es la 5.1.
  #6 (permalink)  
Antiguo 17/11/2010, 10: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, 5 meses
Puntos: 2658
Respuesta: AYUDA Trigger mysql

Un script de Stored Procedure, Stored Function o Trigger debe cargarse de una sola vez, pero cuando tiene muchas líneas debe realizarse un cambio momentaneo de delimitadores de sentencias.
Normalmente en consola o scripts .SQL se hace con DELIMITEER, pero desde el phpMyAdmin, eso lo controla la interfase.

Pero:

- No puede haber declaraciones de variables luego de la creación del cursor.
- Para usar un curso, debes abrirlo y luego cerrarlo.
- Debes crear un HANDLER que controle el límite de lecturas secuenciales o generará un error.
- Los datos leídos por un curso se deben volcar a variables.
- La lectura de un registro se hace con FETCH. Este avanza el puntero al siguiente.
- Un trigger no puede hacer operaciones DML sobre la propia tabla que genera el evento ni contra tablas que posean triggers que la afecten.
- No se puede invocar un SP desde un TRIGGER.
- Los unicos datos entrantes en un TRIGGER son los que provocan el evento, y sólo son accesibles con las pseudovariables NEW y OLD.
- LOOP no es parte de FOR. Son estructuras diferentes y no se inician de esa forma (Ver manual de referencia: 19.2.12. Constructores de control de flujo).
- Varias otars restricciones y detalles más...

Creo que sería mejor que leyeras el capítulo dedicado a los triggers en el manual de referencia(Capítulo 20. Disparadores (triggers)) porque tu trigger contiene numerosos errores y por sobre todo, no necesitas hacer lo que propones para lograr lo que quieres.
__________________
¿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 17/11/2010, 10:30
 
Fecha de Ingreso: abril-2004
Ubicación: Aranjuez
Mensajes: 8
Antigüedad: 20 años
Puntos: 0
Respuesta: AYUDA Trigger mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Un script de Stored Procedure, Stored Function o Trigger debe cargarse de una sola vez, pero cuando tiene muchas líneas debe realizarse un cambio momentaneo de delimitadores de sentencias.
Normalmente en consola o scripts .SQL se hace con DELIMITEER, pero desde el phpMyAdmin, eso lo controla la interfase.

Pero:

- No puede haber declaraciones de variables luego de la creación del cursor.
- Para usar un curso, debes abrirlo y luego cerrarlo.
- Debes crear un HANDLER que controle el límite de lecturas secuenciales o generará un error.
- Los datos leídos por un curso se deben volcar a variables.
- La lectura de un registro se hace con FETCH. Este avanza el puntero al siguiente.
- Un trigger no puede hacer operaciones DML sobre la propia tabla que genera el evento ni contra tablas que posean triggers que la afecten.
- No se puede invocar un SP desde un TRIGGER.
- Los unicos datos entrantes en un TRIGGER son los que provocan el evento, y sólo son accesibles con las pseudovariables NEW y OLD.
- LOOP no es parte de FOR. Son estructuras diferentes y no se inician de esa forma (Ver manual de referencia: [URL="http://dev.mysql.com/doc/refman/5.0/es/flow-control-constructs.html"]19.2.12. Constructores de control de flujo[/URL]).
- Varias otars restricciones y detalles más...

Creo que sería mejor que leyeras el capítulo dedicado a los triggers en el manual de referencia([URL="http://dev.mysql.com/doc/refman/5.0/es/triggers.html"]Capítulo 20. Disparadores (triggers)[/URL]) porque tu trigger contiene numerosos errores y por sobre todo, no necesitas hacer lo que propones para lograr lo que quieres.
Entonces como puedo hacer lo que pido sin triggers de tal manera que cuando se inserte una fila en una tabla se actualice otra tabla?

Lo explico con mi ejemplo: Tengo 1 tabla con datos de centros y otra con datos de citaciones. Lo que quiero hacer es que cada vez que se inserte o se actualice la tabla citaciones en la tabla centros se actualice un campo. Este campo contiene el número de citas que se han hecho a ese centro.

Muchas gracias!
  #8 (permalink)  
Antiguo 17/11/2010, 10:49
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: AYUDA Trigger mysql

Cita:
Lo explico con mi ejemplo: Tengo 1 tabla con datos de centros y otra con datos de citaciones. Lo que quiero hacer es que cada vez que se inserte o se actualice la tabla citaciones en la tabla centros se actualice un campo. Este campo contiene el número de citas que se han hecho a ese centro.
Allí puede convenirte un TRIGGER, pero la necesidad de ese campo en la otra tabla es absolutamente discutible.
Normalmente no se deben (por principio) almacenar datos calculables, entendiendo por tales datos que pueden obtenerse al mismo tiempo que se realizan las consultas relacionadas con esos datos, o bien datos de agregación que tienen alguna variación el el tiempo.
No es una buena práctica porque obtener esos mismos datos en una forma actualizada lleva casi el mismo tiempo que leer esa tabla, con el agregado de que un campo de acumulador requiere procesos extra (como este y otros más) para resguardar su consistencia.Y esos procesos extra implican las mismas consultas que para obtener el dato dinamicamente... lo que hace que almacenarlo termine siendo innecesario.

¿Se comprende la idea?

Bueno. Un TRIGGER que haga lo que quieres sería mas o menos así:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS ACT_CENTROS ;
  3. CREATE TRIGGER ACT_CENTROS AFTER INSERT on sugartest.citas_citas_nominales
  4. UPDATE sugartest.citas_centros
  5.     SET num_ausencias = (num_ausencias + new.ausencias),
  6.     num_citas_totales=(num_citas_totales+citas_totales),
  7.     num_asistencias=(num_asistencias+NEW.asistencias)
  8. WHERE citas_centros.id=NEW.id_centro;
  9. END$$
  10. DELIMITER;
Faltaría solamente una validación para saber si el id_centro entrante existe o no en sugartest.citas_centros, y en caso contrario realizar un INSERT, o bien hacer un INSERT ... ON DUPLICATE KEY UPDATE...
__________________
¿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 17/11/2010, 10: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, 5 meses
Puntos: 2658
Respuesta: AYUDA Trigger mysql

De ese script, para hacerlo en phpMyAdmin sólo necesitas:
Código MySQL:
Ver original
  1. CREATE TRIGGER ACT_CENTROS AFTER INSERT on sugartest.citas_citas_nominales
  2. UPDATE sugartest.citas_centros
  3.     SET num_ausencias = (num_ausencias + new.ausencias),
  4.     num_citas_totales=(num_citas_totales+citas_totales),
  5.     num_asistencias=(num_asistencias+NEW.asistencias)
  6. WHERE citas_centros.id=NEW.id_centro;
  7. END$$
Y luego, abajo a la derecha o a la izquierda, en la ventana de SQL, en donde hay un textbox, se pone "$$", para que reconozca que ese es el fin de sentencia que vas a usar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 17/11/2010, 10:56
 
Fecha de Ingreso: abril-2004
Ubicación: Aranjuez
Mensajes: 8
Antigüedad: 20 años
Puntos: 0
Respuesta: AYUDA Trigger mysql

Ok gracias voy a ponerme con ello a darle forma.
Os voy contando.

Gracias!!

Etiquetas: 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 13:39.