2009-08-23 41 views
78

¿Es posible disparar un disparador mysql para los eventos de inserción y actualización de una tabla?MySQL Fire Trigger para insertar y actualizar

Sé que puedo hacer lo siguiente

CREATE TRIGGER my_trigger 
    AFTER INSERT ON `table` 
    FOR EACH ROW 
BEGIN 
..... 
END // 

CREATE TRIGGER my_trigger 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
..... 
END // 

Pero ¿cómo puedo hacer

CREATE TRIGGER my_trigger 
    AFTER INSERT ON `table` AND 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
..... 

¿Es posible, o tengo que utilizar 2 gatillos? El código es el mismo para ambos y no quiero repetirlo.

Respuesta

94

Debe crear dos desencadenadores, pero puede mover el código común a un procedimiento y hacer que ambos invoquen el procedimiento.

+1

eso es una buena idea. No había pensado en usar un procedimiento también. –

+1

¿Podría dar un ejemplo de esto para aquellos que no están familiarizados con la sintaxis? – Zxaos

+2

@Zxaos: Sugiero comenzar con http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html (que incluye algunos ejemplos) y hacer sus propias preguntas si es necesario. – derobert

8

por desgracia no podemos usar en MySQL después de insertar o actualizar descripción, al igual que en Oracle

38

En respuesta a la solicitud @Zxaos, ya que no podemos tener y/o operadores para MySQL desencadena, a partir de su código, a continuación se muestra un ejemplo completo para lograr lo mismo.

1. Definir el gatillo INSERT:

DELIMITER // 
DROP TRIGGER IF EXISTS my_insert_trigger// 
CREATE [email protected] TRIGGER my_insert_trigger 
    AFTER INSERT ON `table` 
    FOR EACH ROW 

BEGIN 
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table` 
    -- NEW.id is an example parameter passed to the procedure but is not required 
    -- if you do not need to pass anything to your procedure. 
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id); 
END// 
DELIMITER ; 

2. definir el disparo ACTUALIZACIÓN

DELIMITER // 
DROP TRIGGER IF EXISTS my_update_trigger// 

CREATE [email protected] TRIGGER my_update_trigger 
    AFTER UPDATE ON `table` 
    FOR EACH ROW 
BEGIN 
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table` 
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id); 
END// 
DELIMITER ; 

3. definir el procedimiento común utilizado por estos dos gatillos:

DELIMITER // 
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table// 

CREATE [email protected] PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255)) 
READS SQL DATA 
BEGIN 

    -- Write your MySQL code to perform when a `table` row is inserted or updated here 

END// 
DELIMITER ; 

Tenga en cuenta que me ocupo de restaurar el delimitador cuando haya terminado con mi empresa que define los desencadenantes y el procedimiento.

+1

¿Qué es 'IN table_row_id VARCHAR (255)' en este caso? Quiero decir, ¿cómo estás definiendo qué fila se insertará o actualizará? – VaTo

Cuestiones relacionadas