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 il CREATE , utilizzare un LOCK TABLES myTable WRITE; innanzitutto per evitare l'inconsistenza dei dati e UNLOCK TABLES; dopo il CREATE 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 ;


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow