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;







palyginti kainas