MySQL
TRIGGER
Ricerca…
Sintassi
- CREATE [DEFINER = {utente | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body
- trigger_time: {PRIMA | DOPO }
- trigger_event: {INSERIRE | AGGIORNAMENTO | ELIMINA }
- trigger_order: {SEGUE | PRECEDES} other_trigger_name
Osservazioni
Due punti devono attirare la tua attenzione se già usi i trigger su altri DB:
PER OGNI FILA
FOR EACH ROW
è una parte obbligatoria della sintassi
Non puoi fare un trigger di istruzioni (una volta per query) come Oracle. È più un problema legato alle prestazioni che una vera caratteristica mancante
CREARE O SOSTITUIRE IL TRIGGER
CREATE OR REPLACE
non è supportato da MySQL
MySQL non consente questa sintassi, devi invece usare quanto segue:
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
Fai attenzione, questa non è una transazione atomica :
- perderai il vecchio trigger se
CREATE
fallisce - su un carico pesante, possono verificarsi altre operazioni tra il
DROP
e ilCREATE
, utilizzare unLOCK TABLES myTable WRITE;
innanzitutto per evitare l'inconsistenza dei dati eUNLOCK TABLES;
dopo ilCREATE
per rilasciare la tabella
Trigger di base
Crea tabella
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
Crea trigger
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)
L'istruzione CREATE TRIGGER crea un trigger denominato ins_sum associato alla tabella dell'account. Include anche clausole che specificano il tempo di azione del trigger, l'evento di attivazione e cosa fare quando il trigger si attiva
Inserisci valore
Per utilizzare il trigger, impostare la variabile accumulator (@sum) su zero, eseguire un'istruzione INSERT e quindi vedere quale valore ha in seguito la variabile:
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 |
+-----------------------+
In questo caso, il valore di @sum dopo l'esecuzione dell'istruzione INSERT è 14.98 + 1937.50 - 100 o 1852.48.
Drop Trigger
mysql> DROP TRIGGER test.ins_sum;
Se si rilascia una tabella, vengono scartati anche eventuali trigger per la tabella.
Tipi di trigger
sincronizzazione
Esistono due modificatori del tempo di azione del trigger:
-
BEFORE
trigger si attiva prima di eseguire la richiesta, -
AFTER
attivare il fuoco dopo il cambiamento.
Evento scatenante
Esistono tre eventi ai quali è possibile associare trigger:
-
INSERT
-
UPDATE
-
DELETE
Prima di inserire l'esempio di trigger
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 ;
Prima dell'esempio di trigger di aggiornamento
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 ;
Dopo l'esempio di trigger Elimina
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 ;