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

Otro error con Triggers

Estas en el tema de Otro error con Triggers en el foro de Mysql en Foros del Web. Buenos días, Tengo un problema con el uso de Triggers. Hace un tiempo hize un trigger que me evitó duplicaciones antes de realizar un insert ...
  #1 (permalink)  
Antiguo 09/11/2010, 06:40
 
Fecha de Ingreso: noviembre-2010
Mensajes: 24
Antigüedad: 13 años, 5 meses
Puntos: 0
Otro error con Triggers

Buenos días,

Tengo un problema con el uso de Triggers.

Hace un tiempo hize un trigger que me evitó duplicaciones antes de realizar un insert en una tabla. Ahora debo pasar ese proyecto de mi ordenador a un servidor y resulta que los triggers que tenía funcionando han dejado de hacerlo.

Mi versión es la 5.1.41 y la del servidor es la 5.0.32. He estado buscando información sobre el cambio de sintaxis que debo aplicar, pero no hay manera de que me funcione.

Mi tabla es la siguiente:

Código PHP:
CREATE TABLE IF NOT EXISTS `user` (
  `
id_userint(11NOT NULL AUTO_INCREMENT,
  `
loginvarchar(255COLLATE utf8_bin DEFAULT NULL,
  `
passwordvarchar(255COLLATE utf8_bin DEFAULT NULL,
  `
statetinyint(1) DEFAULT NULL,
  `
namevarchar(255COLLATE utf8_bin DEFAULT NULL,
  `
descriptionvarchar(255COLLATE utf8_bin DEFAULT NULL,
  `
emailvarchar(255COLLATE utf8_bin DEFAULT NULL,
  `
data_inserttimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  
PRIMARY KEY (`id_user`)
ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Y mi trigger inicial que funciona en versión 5.1.X es:

Código PHP:
DELIMITER //
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
 
FOR EACH ROW begin
  
if (select count(*) from user where login=new.login and password=new.password) > 0 then
    call fail
('Repeated insert into "user"');
  
end if;
 
end
//
DELIMITER 
Y el procedimiento al que llamo es:

Código PHP:
CREATE PROCEDURE Fail(_Message VARCHAR(255))
INSERT INTO error (MessageVALUES (_Message); 
Si intento ejecutar el Trigger en la versión 5.0.32 me da el siguiente fallo:

Error
Parece haber un error en su consulta de SQL. La salida generada por el servidor de MySQL, de existir, aparece abajo, en cuyo caso puede ayudar a diagnosticar el problema.
ERROR: Signo de puntuación desconocido @ 11
STR: //
SQL: DELIMITER //
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
FOR EACH ROW begin if (select count(*) from user where login=new.login and password=new.password) > 0 then call fail('Repeated insert into "user"');

consulta SQL:
DELIMITER // CREATE TRIGGER user_no_repeat BEFORE INSERT ON user FOR EACH ROW begin if (select count(*) from user where login=new.login and password=new.password) > 0 then call fail('Repeated insert into "user"');
MySQL ha dicho:
#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 'DELIMITER //
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
FOR EACH ROW' at line 1


He probado a cambiar las // por &&, por %% y por ;; y nada, me da el mismo error.
Finalmente en algún sitio he visto que decía que funcionaba si quitabas los delimitadores, de hecho el procedimiento ‘Fail’ lo he creado quitando los delimiter. Así que sin ellos el error que obtengo es el siguiente:

Código PHP:
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
 
FOR EACH ROW begin
  
if (select count(*) from user where login=new.login and password=new.password) > 0 then 
   call fail
('Repeated insert into "user"');
  
end if;
 
end 
MySQL ha dicho:
#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 4


Si ejecuto solamente la linea “call fail('Repeated insert into "user"');” me funciona perfectamente, incluso he intentado cambiar la llamada por el insert a la tabla de error directamente:

Código PHP:
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
 
FOR EACH ROW begin
  
if (select count(*) from user where login=new.login and password=new.password) > 0 then 
    insert into error 
(id_errormessagedata_insertvalues (null"Repeated insert into user"now());
  
end if;
 
end 
Pero tampoco:

MySQL ha dicho:
#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 'insert into error (EID, message, data_insert) values (null, "Repeated insert int' at line 4

Y si ejecuto solo el insert, se realiza correctamente la inserción a la tabla de error.


La verdad es que he estado mirando y buscando alguna solución y no lo he encontrado… alguna idea?

Gracias!!!
  #2 (permalink)  
Antiguo 09/11/2010, 07:33
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 error con Triggers

A mi entender tienes varios problemas:
1) No es buena práctica trabajar con diferentes versiones entre el servidor para desarrollo y el servidor para trabajo (host final). Esto suele hacer que ciertas cosas funciones bien en las etapas de desarrollo y luego no funcionen mas, simplemente porque las capacidades son diferentes, y en uno hay ciertos bugs ya reparados que susbsisten en la versión más vieja. En tu caso o actualizas el servidor de trabajo o haces un downgrade del de desarrollo. Eloge.

2) Estás usando palabras reservadas como nombres de campo (password, por ejemplo). Eso puede producir errores de sintaxis de difícil depración.

3) No puedes llamar a un SP desde un trigger en MySQL. El parser no lo admite. Es una restricción que aún se mantiene:
Cita:
El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la prohibición de referirse a tablas por su nombre).
__________________
¿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 09/11/2010, 10:14
 
Fecha de Ingreso: noviembre-2010
Mensajes: 24
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Otro error con Triggers

Hola,

1 -> estoy de acuerdo con el primer punto al 100%, soy relativamente nueva en la empresa y ya tienen el servidor contratado y demás cosas que aún no he tenido tiempo de "arreglar",... así que ya veremos cómo soluciono esto!

2 -> tienes algún link que contenga este listado? En el que yo he encontrado, la palabra 'password' no esta y no se si es que es una lista vieja o que, mira:

http://dev.mysql.com/doc/refman/5.0/es/reserved-words.html


3 -> pues vaya, para las versiones 5.1.X si que me funcionaba el 'call' al procedimiento 'Fail' que comentaba :( ,... en fin. Aún así, con el insert directamente en lugar del fail tampoco funciona.

Código PHP:
CREATE TRIGGER user_no_repeat BEFORE INSERT ON user
 
FOR EACH ROW begin
  
if (select count(*) from user where login=new.login and password=new.password) > 0 then 
    insert into error 
(id_errormessagedata_insertvalues (null"Repeated insert into user"now());
  
end if;
 
end 

Muchas gracias!!!!
  #4 (permalink)  
Antiguo 09/11/2010, 12: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: Otro error con Triggers

Por un lado, el listado sigue siendo más o menos el mismo, pero las reglas más simples para evitar problemas son:
1) todas las palabras que son comandos, sentencias, cláusulas o funciones son siempre palabras reservadas... y PASSWORD lo es en todos los DBMS.
2) Usa siempre un editor que reconozca la sintaxis y que resalte comandos, sentencias, cláusulas o funciones , como por ejemplo: MySQL Workbench, MySQL Query Browser, o alguno así.
__________________
¿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 10/11/2010, 03:44
 
Fecha de Ingreso: noviembre-2010
Mensajes: 24
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Otro error con Triggers

ok, usaré tus consejos!
Gracias! :D

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 07:41.