Buscar..


Sintaxis

  • CREAR [DEFINER = {usuario | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name PARA CADA FILA [trigger_order] trigger_body
  • trigger_time: {ANTES | DESPUÉS }
  • trigger_event: {INSERT | Actualización | BORRAR }
  • trigger_order: {SIGUE | PRECEDES} other_trigger_name

Observaciones

Dos puntos deben llamar su atención si ya usa desencadenantes en otros DB:

POR CADA FILA

FOR EACH ROW es una parte obligatoria de la sintaxis.

No se puede hacer un desencadenante de declaración (una vez por consulta) como lo hace Oracle. Es más un problema relacionado con el rendimiento que una característica faltante real

CREAR O REEMPLAZAR EL GATILLO

MySQL no admite CREATE OR REPLACE

MySQL no permite esta sintaxis, en su lugar tiene que usar lo siguiente:

DELIMITER $$

DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...

$$
DELIMITER ;

Tenga cuidado, esto no es una transacción atómica :

  • perderás el gatillo viejo si falla la CREATE
  • en una carga pesada, otras operaciones pueden ocurrir entre el DROP y el CREATE , usar una LOCK TABLES myTable WRITE; primero para evitar inconsistencias de datos y UNLOCK TABLES; después de la CREATE para liberar la tabla

Disparador basico

Crear mesa

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

Crear gatillo

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)

La declaración CREATE TRIGGER crea un desencadenante denominado ins_sum que está asociado con la tabla de cuentas. También incluye cláusulas que especifican el tiempo de acción del activador, el evento de activación y qué hacer cuando se activa el activador.

Insertar valor

Para usar el disparador, establezca la variable del acumulador (@sum) en cero, ejecute una instrucción INSERT y luego vea qué valor tiene la variable después:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48               |
+-----------------------+

En este caso, el valor de @sum después de que se haya ejecutado la instrucción INSERT es 14.98 + 1937.50 - 100, o 1852.48.

Drop Trigger

mysql> DROP TRIGGER test.ins_sum;

Si suelta una tabla, también se eliminan los disparadores de la tabla.

Tipos de disparadores

Sincronización

Hay dos modificadores de tiempo de acción de disparo:

  • BEFORE activador se active antes de ejecutar la solicitud,
  • AFTER disparar el fuego después del cambio.

Evento desencadenante

Hay tres eventos que los desencadenantes se pueden adjuntar a:

  • INSERT
  • UPDATE
  • DELETE

Antes de Insertar ejemplo de activador

DELIMITER $$

CREATE TRIGGER insert_date 
    BEFORE INSERT ON stack
    FOR EACH ROW
BEGIN
        -- set the insert_date field in the request before the insert
    SET NEW.insert_date = NOW();
END;

$$
DELIMITER ;

Antes de actualizar el ejemplo de activación

DELIMITER $$

CREATE TRIGGER update_date 
    BEFORE UPDATE ON stack
    FOR EACH ROW
BEGIN
        -- set the update_date field in the request before the update
    SET NEW.update_date = NOW();
END;

$$
DELIMITER ;

Después de eliminar el ejemplo de activación

DELIMITER $$

CREATE TRIGGER deletion_date 
    AFTER DELETE ON stack
    FOR EACH ROW
BEGIN
        -- add a log entry after a successful delete
    INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;

$$
DELIMITER ;


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow