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

[SOLUCIONADO] problemas con triggers

Estas en el tema de problemas con triggers en el foro de Mysql en Foros del Web. hola amigos, tengo problemas con este trigger y no veo donde esta el error ¿me echais una mano? el trigger en cuestion es este: @import ...
  #1 (permalink)  
Antiguo 29/04/2016, 05:51
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
problemas con triggers

hola amigos,
tengo problemas con este trigger y no veo donde esta el error ¿me echais una mano?

el trigger en cuestion es este:
Código MySQL:
Ver original
  1. CREATE TRIGGER k2 BEFORE INSERT ON k FOR EACH ROW BEGIN IF District IS NULL OR District= '' THEN SET NEW.District='Unknown';end if;

.. y los errores que obtengo son estos:
ERROR 1064 (42000): 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 1

ERROR 1064 (42000): 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 'end if' at line 1
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #2 (permalink)  
Antiguo 29/04/2016, 05:54
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: problemas con triggers

Lo mas probable es que estés intentado crearlo a mano, en algún front-end como phpmyadmin. Si es así, el problema radica en que el trigger en cuestión es de más de una linea, y para eso se deben cargar de un modo especial.

¿Qué estás usando para intentar compilarlo?
__________________
¿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 29/04/2016, 06:10
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: problemas con triggers

estoy en el cliente de mysql, nada de pMA

lo que no entiendo es porque me da error en el 'end if', si lo quito no aparece ese error
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #4 (permalink)  
Antiguo 29/04/2016, 06:35
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: problemas con triggers

Ok.
Bueno, para cargar CUALQUIER rutina almacenada por consola, como stored procedures, stored functions, trigers o events, lo que debes hacer es cambiar momentaneamente el delimitador de sentencais de MySQL por otra cosa, a fin de que tome el conjunto de lineas como ua sola cosa.
Eso se hace simplemente con el comando DELIMITER>
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE TRIGGER k2 BEFORE INSERT ON k
  4.     IF District IS NULL OR District= '' THEN
  5.         SET NEW.District='Unknown';
  6.     END IF;
  7. END$$
  8.  
  9. DELIMITER ;

En la primera linea se cambia el terminador ";" por "$$", algo que carece de significado en MySQL y solo es para que interprete que termino la sentencia y que ejecute todo.

Luego viene el codigo a cargar (dicho sea de paso, te olvidaste el END final para el BEGIN), cerrado por el "$$".

Finalmente restauras el terminador estandar de nuevo y listo.
__________________
¿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 29/04/2016, 07:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: problemas con triggers

ok, entiendo el problema: cuando hay mas de un ';' en el trigger debemos cambiar el delimitador ¿es asi?

Pero ¿no deberia bastar con meter todos los ';' dentro de un bloque BEGIN-END? asi solo tendriamos/"veria" un solo ';'(el del END de cierre de bloque)
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #6 (permalink)  
Antiguo 29/04/2016, 07:07
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: problemas con triggers

Cita:
Pero ¿no deberia bastar con meter todos los ';' dentro de un bloque BEGIN-END? asi solo tendriamos/"veria" un solo ';'(el del END de cierre de bloque)
Eso no existe en MySQL.

Tal vez exista en otro DBMS, pero no en MySQL y si vas a crear el TRIGGER en MySQL, debes cumplir las reglas de MySQL.
Así de simple.
__________________
¿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 29/04/2016, 07:12
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: problemas con triggers

abstraer todo el cuerpo del trigger en en una sola instruccion(bloque BEGIN-END) y asi no tener problemas con el delimitador suena lo mas logico, no crees? no conozco otros DBMS............

una vez creado el trigger, sigo teniendo problemas(no ya con el trigger), intento que el trigger se dispare al insertar en la tabla k(la tabla k solo contiene el capo District, de tipo char(8)):
Código MySQL:
Ver original 
pero obtengo este "misterioso" error: ERROR 1054 (42S22): Unknown column 'District' in 'field list'
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #8 (permalink)  
Antiguo 29/04/2016, 07:23
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: problemas con triggers

Porque, como en TODOS los demás DBMS, los campos de un registro que se inserta o se actualiza en un trigger NO se puede invcar solamente por su nombre. Debes usar las peudovariables NEW y OLD, como referencia del registro que estás modificando (cada uno de os que el trigger procesa).
Me parece que necesitas leer de nuevo el manual de referencia, porque este tema está claramente explicado en él.

La cosa es así: Cada vez que insertas un registro, y en la tabla hay un trigger para ese evento, el registro queda en un estado de proceso y asociado a una pseudovariable denominada NEW. En el caso de los UPDATE y DELETE, el registro existente es el OLD.
Entonces, mientras estás dentro del trigger obligatoriamente debes referirte a él con ese nombre, de lo contrario se generará un error de ejecución porque MySQL intenta encontrar una columna o tabla con el nombre de campo que quieres, y no existe.

Vamos de vuelta entonces:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE TRIGGER k2 BEFORE INSERT ON k
  4.     IF NEW.District IS NULL OR NEW.District= '' THEN
  5.         SET NEW.District='Unknown';
  6.     END IF;
  7. END$$
  8.  
  9.  DELIMITER ;
__________________
¿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 29/04/2016, 07:58
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: problemas con triggers

Con la modificacion de ltrigger(NEW.xxx), ahora si:

>insert into k values('');
Query OK, 1 row affected (0.00 sec)

>select * from k;
+----------+
| District |
+----------+
| Unknown |
+----------+
1 row in set (0.00 sec)

mil gracias gonzalo:D
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #10 (permalink)  
Antiguo 29/04/2016, 08:15
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: problemas con triggers



__________________
¿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: Ninguno
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 22:50.