MySQL
Gatillos
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 elCREATE
, usar unaLOCK TABLES myTable WRITE;
primero para evitar inconsistencias de datos yUNLOCK TABLES;
después de laCREATE
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 ;