sábado, 12 de febrero de 2011

Phpmyadmin no admite crear triggers con DELIMITER y BEGIN END;

CONCEPTOS TEÓRICOS SOBRE CREACIÓN DE TRIGGER EN MYSQL
Si consultamos la página oficial de mysql, vemos que hay que tener en cuenta 2 aspectos que difieren con el resto de SGBD (El delimiter y el BEGIN END).

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END
|

DELIMITER ;

*ANOTACIÓN SOBRE BEGIN END: Si sólo voy a ejecutar una sentencia dentro del trigger no es necesario poner la opción BEGIN END, pero si el trigger tiene que ejecutar multiples sentencias si que es necesario ponerlo.

PROBLEMA DE TRIGGERS EN PHPMYADMIN

El problema viene cuando queremos crear un trigger en phpmyadmin y utilizamos la sintaxis oficial de creación de un trigger en mysql. Según el mensaje que aparece por pantalla, parece que phpmyadmin si que lo crea, porque nos dice que es todo correcto.

Pero cuando vamos a consultar a ver si el trigger está creado, nos damos cuenta que realmente no lo ha creado. Sentencia: SHOW TRIGGERS.

SOLUCIÓN PARA CREACIÓN DE TRIGGERS EN PHPMYADMIN

Entonces...phpmyadmin no admite la sintaxis oficial de mysql???...Realmente si que la admite, lo que pasa es que parte del código que nosotros escribimos, él ya lo hace internamente.
Si nos fijamos en la ventana donde creamos el trigger o cualquier sentencia, abajo del todo hay una casilla que pone “DELIMITADOR ;”, lo que esta ocurriendo es que cada vez que nosotros ejecutamos un trigger el internamente nos pone la cabecera y el final del trigger con delimitador y utilizar el carácter “;”.
Al utilizar el carácter “;”, hace que nosotros no podamos crear en trigger con la opción BEGIN END; (sentencia que nos es necesaria cuando queremos ejecutar más de una sentencia).

La solución la tenéis en la imagen, hay que indicar al phpmyadmin que elija otro delimitador cualquiera (un carácter que no utilicemos dentro de nuestro código) y de esta forma podemos acabar el trigger con un BEGIN END;







6 comentarios:

  1. Muchas gracias Vero por esta publicacion, me ha sido de mucha utilidad. Desde El Salvador, Centroamerica.

    ResponderEliminar
  2. Muchas gracias por el aporte, pero he hecho tal y como dices y no me sale :(
    El trigger es:
    CREATE OR REPLACE TRIGGER AHistoricoAlumnos
    AFTER DELETE ON Alumno
    FOR EACH ROW
    BEGIN
    INSERT INTO HistoricoAlumnos
    VALUES (old.dni,OLD.nombre,OLD.apellidos,OLD.domicilio,OLD.ciudad,OLD.cp,OLD.telefono,OLD.email);
    END;

    Y el delimitador lo he cambiado =(

    Gracias!

    ResponderEliminar
  3. Puede que te esté fallando porque haya un error en hacer la insert...en principio la clave esta en no poner la palabra DELIMITER y en el cajetin poner el DELIMITER con cualquier otro carácter que no sea ;

    ResponderEliminar
  4. muchas gracias me ha salvado la vida y por cierto anónimo, create or replace no me funciona así que ahí está el fallo.

    ResponderEliminar
  5. muchas gracias, me has salvado la vida, lo del puto delimiter, por cierto anónimo el CREATE OR REPLACE TRIGGER no me funciona así que supongo que tendrás que cambiarlo

    ResponderEliminar
  6. funciona perfecto, a los que no les funciono es porke tienen que escrivir la consulta con el delimeter, pero sin escribir la sentencia delimeter ej:

    DELIMITER |

    CREATE TRIGGER testref BEFORE INSERT ON test1
    FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
    END
    |

    DELIMITER ;

    se escribe el trigger con sus caracteres delimeter..

    CREATE TRIGGER testref BEFORE INSERT ON test1
    FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
    END
    |

    y en el recuadro de "DELIMETER" escrivir el caracter que se usó "|" (sin comillas.

    ResponderEliminar

palyginti kainas