mercoledì 27 luglio 2011

MySql modificare un trigger

In questo post vediamo una caratteristica (piuttosto scomoda) di Mysql, ossia il fatto che un trigger , una volta creato, non è  più modificabile.
Praticamente non esiste una istruzione del tipo “alter trigger”e bisogna necessariamente cancellarlo (drop trigger [nome_trigger]) e ricrearlo.
Vediamo un esempio completo

NOTA: In Mysql , quando si lancia uno script per creare una tabella oppure una stored procedure oppure un trigger, il carattere “;” è utilizzato come delimitatore standard.
Praticamente se si lancia uno script al primo ;  Mysql ritiene chiuso lo stesso script; per questo motivo usando le Stored Procedure oppure i trigger da riga di comando è necessario cambiare i delimitatori.

Data una semplice tabella anagrafica con questa struttura:


CREATE TABLE  `actionbazaar`.`anagrafica` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) NOT NULL,
  `cognome` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 


Vogliamo realizzare un trigger che, per ogni delete sulla tabella anagrafica vada a scrivere il record di cancellazione su una  tabella così definita.




CREATE TABLE  `actionbazaar`.`anagrafica_clone` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) NOT NULL,
  `cognome` varchar(45) NOT NULL,
  `cancellazione` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 












Il nostro trigger sarà definito in questo modo:


delimiter $$
create trigger tr_anagrafica_canc
after delete on anagrafica
for each row
begin
insert into actionbazaar.anagrafica_clone(nome,cognome)
values(old.nome,old.cognome);
end $$
delimiter ;

 







Per “ritrovare” la sintassi di creazione del trigger lanciare il comando show triggers,
nel nostro caso avremo


mysql> show triggers \G
*************************** 1. row ***************************
             Trigger: tr_anagrafica_canc
               Event: DELETE
               Table: anagrafica
           Statement: begin
insert into actionbazaar.anagrafica_clone(nome,cognome)
values(old.nome,old.cognome);
end
              Timing: AFTER
             Created: NULL
            sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.02 sec)
 




Dobbiamo quindi salvarci queste informazioni, effettuare la drop trigger tr_anagrafica_canc e successivamente ricrearlo con le opportune modifiche.

Nessun commento:

Posta un commento