Creando “triggers” con phpMyAdmin

Publicado: 03/01/2010 en base de datos, MySQL, phpMyAdmin, trigger
Etiquetas:, , , ,

You can read the English version of this post in http://phpsblog.agustinvillalba.com/create-triggers-phpmyadmin/

Esta semana me he tenido que enfrentar a la “ardua” tarea de añadir un trigger a mi base de datos MySQL a través de phpMyAdmin. Digo ardua porque phpMyAdmin no admite, por defecto, la sintaxis estándar de MySQL para insertar los disapradores en la base de datos. Así que hoy vamos a hablar acerca de los triggers o disparadores de MySQL, sobre todo de cómo añadirlos a la base de datos en cuestión a través del gestor phpMyAdmin.

Creando triggers en MySQL

La creación de los triggers o disparadores la podemos hacer siguiendo las recomendaciones que podemos encontrar en http://dev.mysql.com/doc/refman/5.0/es/create-trigger.html (http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html, para MySQL 5.5, en inglés). Aquí nos explican perfectamente cómo hemos de escribir nuestro trigger y nos dan algunos ejemplos. Por si no quieres visitar esa web, o no tienes tiempo aquí pongo un ejemplo de creación de un disparador. En este ejemplo partimos de la base que tenemos una tabla de usuarios llamada “usuario” y una tabla de alumnos, que son un subtipo de usuario, llamada “alumno”, por lo que es necesario insertar el id del usuario en la tabla de alumno inmediatamente después de haberlo insertado en la tabla de usuario:

CREATE TRIGGER ins_alumno AFTER INSERT ON usuario
FOR EACH ROW
BEGIN
IF NEW.tipo = 'alumno' THEN
    INSERT INTO alumno (`id`) VALUES (NEW.id);
END IF;
END;

Bien, expliquemos un poco este código. En la primera linea creamos el trigger llamado ins_alumno, el cual se disparará SIEMPRE que se inserte un nuevo registro en la tabla usuario. La siguiente línea indica que este trigger se disparará en cada inserción de una nueva fila. A continuación creamos un bloque IF en el que preguntamos si el tipo del nuevo registro es igual al literal ‘alumno’ entonces se realiza la inserción del nuevo id en la tabla alumno. Por último cerramos todos los bloques.

Introduciendo el disparador en phpMyAdmin

Si intentamos poner este código en una sentencia sql en phpMyAdmin y la ejecutamos tal cual nos dará problemas con los separadores del propio gestor. Me explico, phpMyAdmin utiliza el carácter “;” como separador por defecto, y si nos fijamos en la sentencia hemos utilizado ese carácter como finalizador de instrucción porque así lo requiere el servidor MySQL. Así que, aquí es dónde viene la parte más IMPORTANTE de este artículo y lo que más rompederos de cabeza me dió, y es algo tan simple como cambiar el delimitador de phpMyAdmin en el cuadro de texto que se encuentra justo debajo de la caja de texto donde introducimos la query SQL. Es tan sencillo como cambiar el valor de ese cuadro de texto (que ahora es “;”) por el valor “//”. Con esto ya podemos ejecutar nuestra sentencia sin problemas, dado que ahora el servidor MySQL entenderá que el carácter “;” no es delimitador de sentencias SQL sino que es el indicador de fin de instrucción. Con esto ya tenemos listo y funcionando nuestro disparador en nuestra base de datos MySQL a través de phpMyAdmin.

Actualización (12/02/2013):

Si tu editor de SQL en phpMyAdmin no te permite editar el DELIMITER o sencillamente no te aparece ese campo de texto, es debido a que tu versión de phpMyAdmin es muy antigua y no soporta la modificación del DELIMITER. Tampoco podrás modificarlo mediante una sentencia MySQL, dado que la sentencia DELIMITER no forma parte del grupo de sentencias aceptadas por el servidor MySQL, sino que forma parte del cliente MySQL que utilices para conectarte al servidor.

You can read the English version of this post in http://phpsblog.agustinvillalba.com/create-triggers-phpmyadmin/

Anuncios
comentarios
  1. edison hernandez dice:

    buenos días
    me puedes colaborar con este trigger me saca error de sintaxis, la idea es hacer que cuando se ingrese un nuevo registro en la tabla productos, no me cree un nuevo registro si no que me sume la nueva cantidad a la cantidad existente si el código del producto es el mismo.

    CREATE TRIGGER actualizar AFTER INSERT ON productos
    FOR EACH ROW
    BEGIN
    UPDATE cantidad
    SET cantidad = cantidad + NEW.cantidad
    WHERE cod_pro = NEW.cod_pro;
    END

  2. jairo martinez dice:

    no me funciona el ejemplo:
    CREATE TRIGGER ins_cliente AFTER INSERT ON usuario
    FOR EACH ROW
    IF NEW.tipo=’cliente’ THEN insert into clientes (nombre) VALUES (NEW.nombre);
    END IF;
    end;
    tengo una tabla usuarios(id, nombre) y otra clientes(id, nombre etc), queria probar el trigger pero no me funciona y me dice que revise la sintaxis.

    Gracias

  3. Roxanna Sabando dice:

    hola amigo me puedes ayudar con este ejemplo de disparador soy novata en esto… me aparece un error #1064 lo que quiero es almacenar en el campo dias_restantes de la tabla_socio la diferencia entre la fecha actual y la fecha de llegada (fecha_llegada) q esta alojada en la tabla_reservacion

    CREATE TRIGGER `tiempo_trigger` AFTER INSERT ON `tabla_reservacion` FOR EACH ROW UPDATE
    UPDATE tabla_socio SET dias_restantes = DATEDIFF(CURDATE(),tabla_reservacion.fecha_llegada)
    WHERE tabla_socio INNER JOIN tabla_reservacion ON (tabla_socio.id_socio = tabla_reservacion .id_socio )

  4. Augusto dice:

    Muchas gracias! lo buscaba desde ya mucho tiempo.

  5. nicolas dice:

    copado! gracias

  6. Ty dice:

    Muy buen post!
    ahora tengo una pequeña duda.. se puede editar el trigger una vez creado
    desde phpmyadmin?

    • Hola,

      Si no recuerdo mal, creo que no puedes editarlos, sino que tienes que eliminar el trigger y volver a crearlo con las modificaciones que quieras hacer, pero no hay posibilidad de edición.

      Saludos.

  7. Pepe Cacho dice:

    Sos un geniooooooo man. Muchas Gracias

  8. evis dice:

    gx sirvio de mucho st articuloo….

  9. rubencorrales dice:

    Hola sabe alguien como disparar una url de internet desde un trigger con phpmyadmin

    gracias

  10. jeny dice:

    hola, algo no me quedo claro en la linea IF NEW.tipo = ‘alumno’ THEN …por ejemplo NEW.tipo dices que el tipo es el nombre del campo que se ingresa? es desir el id ? o es el tipo de variable del id por ejemplo NEW.int …..y la palabra ‘alumno’ corresponde definitivamente al nombre de la tabla?

  11. Mcardenas dice:

    Por favor necesito ayuda acerca de como o en que parte hacer el triger en phpmyadmin xq no se en q parte hacerlo es decir poner el codigo del triggers

  12. guillermo dice:

    creo que hay un error en lo que refiere a el envío de correo. Quizá puede ser que en mysql no se pueda pero en SQL se pueden enviar hasta con un formato HTML defininido en el trigger
    Me queda la duda entonces de como hacer el trigger en mysql para el envio de correo¿servira la misma sintaxis que en sql?
    ET @Destino = @mail

    EXEC msdb.dbo.sp_send_dbmail
    @copy_recipients =’guillermo@w.cl’,
    @importance = ‘High’,
    @subject = @asunto,
    @body = @mensaje,
    @body_format = ‘HTML’ ;

  13. raul dice:

    Gracias por la información, saludos desde Río Gallegos, al sur del sur de Argentina

  14. m16u64 dice:

    gracias sirvio de mucho ,, ya que lo hice rapido

  15. Facundo dice:

    Excelente artículo!!

    Aprovecho para dejar una consulta que le surge a varias personas… ¿Es posible crear un trigger desde phpMyAdmin que envie un e-mail luego de la inserción de un registro en una tabla determinada?.

    Gracias y saludos.

    • Muchas gracias!
      Con respecto a tu pregunta, la respuesta es que es imposible, dado que estás intentando realizar desde la capa de base de datos una operación (envío de correo electrónico) que corresponde a la capa de aplicación. La capa de base de datos sólo entiende de sentenias SQL, no sabe nada acerca de servidores de correo ni nada parecido. Por eso, los correos electrónicos ha de enviarlos tu aplicación, no puedes encargarle esa tarea a la base de datos. Además, ten en cuenta que el phpMyAdmin no es más que un gestor gráfico del servidor MySQL, por lo que no está capacitado para realizar envíos de ningún tipo.

      Saludos!

  16. javier dice:

    No tengo palabras para agradecerte. Llevaba dos días escribiendo correctamente el trigger en phpMyAdmin sin dar con el error. GRACIAS

  17. diego dice:

    muchisimas gracias por el aporte, me estaba matando la cabeza porque no me creaba el triger debido a que no definia el delimitador en la caja de texto debajo de SQL.

    No obstante tengo un problema. en mi maquina local todo funciona a la perfeccion, me crea los trigers sin problema, pero cuanto intento hacer pruebas en el servidor de internet donde alojo mi base de datos no puedo crear los trigers porque no me aparece la caja de texto para definir el delimitador. he visto en algunos foros que usan antes del triger el comando “delimiter //” pero no da resultado. ¿sabria alguien por favor darme una idea de como definir los trigers en el servidor de produccion?

    Tengo entendido que se deben tener privilegios de SUPER en MySQL para poder crear los trigers… ¿como se si los poseo y mi problema es simplemente de sintaxis?

    De antemano muchisimas gracias por el tiempo de leer este post. Agradezco su ayuda.

    • Carlos Burgos dice:

      se que ya paso demasiado tiempo… pero me acabo de encontrar con este problema, pudiste solucionarlo? en el servidor donde se aloja mi BD tampoco hay ese cuadro de texto, como puedo hacerlo.

      Gracias por anticipado.

    • Buenas!

      Aunque ya ha pasado tiempo desde tu pregunta, nunca es tarde responder.

      Resulta que el poder establecer el DELIMITER o no, no depende de tu servidor MySQL, sino de tu cliente MySQL. Es decir, si no te aparece ese cuadro de texto para modificar el DELIMITER y si intentas ponerlo como parte de la sentencia MySQL y te devuelve un error, es porque tu versión de phpMyAdmin no soporta la sentencia DELIMITER y no sabe cómo interpretarla. Lo que a su vez provoca un error MySQL dado que DELIMITER no es una sentencia MySQL.

      La única solución que te queda es pedirle a tu hosting que actualice la versión de phpMyAdmin que estás utilizando.

      Espero haberte sido de ayuda después de tanto tiempo.

      Un saludo.

  18. klnandokl dice:

    mira que era asi de sencillo
    buen post
    me saco de dudas
    gracias

  19. Mira que dio problemas … Muy bueno el post 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s