Un Trigger č un oggetto del database che, associato ad una tabella, si attiva al presentarsi di un particolare evento (azione intrapresa) sulla particolare tabella.
Un utilizzo classico č quello di loggare, tramite un trigger che inserisce record in una tabella preposta, le varie movimentazioni (insert, update, delete) dei record di una tabella molto critica per il sistema.
La creazione di un trigger introdotta a partire dalla versione MySQL 5.0.2, si basa sulla sintassi
CREATE TRIGGER nome_del_trigger BEFORE|AFTER INSERT|UPDATE|DELETE
ON tabella FOR EACH ROW istruzioni
Come si vede il trigger deve essere associato ad una tabella, questa deve essere una tabella "reale", non quindi una tabella temporanea o una view.
L'esecuzione del trigger puņ avvenire prima o dopo l'evento, questo viene indicato dalla scelta dell'opzione BEFORE
o AFTER
mentre l'evento scatenante puņ essere un operazione di INSERT
, di UPDATE
oppure di DELETE
. Si noti come non sia possibile attivare due distinti trigger sulla stessa azione e sullo stesso momento: ad esempio non possiamo avere due trigger BEFORE INSERT
sulla stessa tabella, possiamo perņ attivarne uno di tipo BEFORE INSERT
e uno di tipo AFTER INSERT
.
L'azione da intraprendere quando il trigger viene attivato č specificata dopo avere indicato FOR EACH ROW
, questa puņ essere un singolo statement oppure un blocco di istruzioni delimitato, al solito, da BEGIN ... END
.
Di interesse il fatto che all'interno della definizione di un trigger č possibile fare riferimento ai valori che un campo assume prima che sia modificato o cancellato: in questo caso si utilizza OLD.nome_campo
, oppure il valore che il campo assume dopo che č stata inserita una nuova riga oppure modificata una esistente: NEW.nome_campo
.
Uscita da trigger
Salve a tutti,
è possibile forzare l'uscita da un trigger (ad es. in presenza di errori) annullando conseguentemente l'azione che lo ha scatenato (INSERT, UPDATE o DELETE)? In pratica cerco un equivalente di raise_application_error di Oracle. Esiste in MySql? Grazie anticipatamente.
cos'ha di sbagliato?
CREATE TRIGGER VINCOLO_OFFERTA
BEFORE INSERT ON OFFERTA
FOR EACH ROW
WHEN(NEW.valore>old.valore);
trigger
Non riesco (non sono molto brava con i trigger) a dirgli di controllare che l'old dia < del new +1. Credo che sia il +1 che mi da problemi... grazie
RispondiSOLUZIONE
Ecco ragazzi.Se per caso state usando un front end per scrivere il trigger state ben attenti che ci sono dei problemi con i delimitatori.Da Mysql 5 i poi c'è il supporto per i trigger e views..ecc quindi non è un problema di supporto l'errore 1064.Scrivete il trigger dal prompt di Mysql digitando prima del CREATE TRIGGER "delimiter $"+INVIO senza i doppi apici ovviamente
SCRIVETE TRANQUILLAMENTE il trigger e alla fine se avete usato un BEGIN ... END usate END$
A me,usando questo accorgimento non mi vengon piu' dati errori...
Ma ancora non riesco a capire perchè il mio Front end fa errori....
CIAO
non riesco a creare i trigger
Ho la versione 5.0.2 di mysql
ho provato a scrivere un trigger :
CREATE TRIGGER changeStateBets BEFORE UPDATE
ON bets
FOR EACH ROW
BEGIN
call `setStateCompositeBet`(new.`father`);
END
non si crea, mi da il seguente errore:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"
qualsiasi altra cosa scrivo nel trigger mi da questo errore, solo se lo lascio vuoto lo crea.
mi potete dare una mano grazie
ciao Pina
anche a me da sto errore
non saprei... ho lo stesso problema
RispondiErrore 1064 nella creazione del trigger
Come mai la creazione del seguente trigger mi dà errore 1064?:
create trigger trigger_emigrazione
AFTER INSERT ON emigrazione
FOR EACH ROW BEGIN
DECLARE data_r DATE;
DECLARE nc VARCHAR(14) DEFAULT '';
SELECT CASE
WHEN ((select max(i.data_rilascio), i.numerocarta
into data_r, nc
from carte_identita i
where i.codiceistatcomune = NEW.codiceistatcomune and
i.codiceidentificativo = NEW.codiceidentificativo
group by i.numerocarta) IS NULL)
THEN SET nc = '';
INSERT INTO anagrafica_cittadini_flag
VALUES (NEW.codiceistatcomune,NEW.codiceidentificativo,'0','0','1','0','0','0','0','0','0','0','0',nc);
COMMIT;
END;