2013-02-08 12 views
8

Quindi, ho una tabella MySQL, denominata dipendenti.Attivatore MySQL PRIMA UPDATE - modifica valore

ID name meta 
0  jack ok 
1  anne del 

Voglio scrivere un trigger che impedisce a una riga dove meta = 'del' aggiornare il campo meta. Quindi, se faccio:

UPDATE employees SET meta = 'busy' WHERE ID = 0 

La riga dovrebbe essere aggiornato e meta sarebbe 'occupato'

Ma quando lo faccio:

UPDATE employees SET meta = 'busy' WHERE ID = 1 

Il campo meta dovrebbe essere ancora 'del '

ho provato:

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     NEW.meta = 'del' 
    END IF; 
END$$ 
delimiter ; 

Ma MySQL restituisce un errore di sintassi. Qualche idea?

risposta

3

vi siete persi ;

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     NEW.meta = 'del'; -- << here 
    END IF; 
END$$ 
delimiter ; 

TRIGGER è il Male.

Un'alternativa per innescare è con l'aggiunta di un'altra condizione AND

UPDATE employees 
SET meta = 'busy' 
WHERE ID = 1 AND meta <> 'del' 
+0

Il trigger non funziona ma ho deciso di utilizzare la seconda soluzione. Grazie! –

+0

prego ": D' –

+14

Perché TRIGGER è malvagio? È uno strumento molto potente che gli amministratori del database possono utilizzare per applicare le regole di integrità dei dati. In un ambiente in cui l'integrità dei dati è fondamentale (ad esempio, i registri aziendali) i trigger forniscono una risorsa preziosa per farli rispettare, anche negli sviluppatori di applicazioni. Ora utilizzo i trigger anche nel mio sviluppo personale, poiché impongono l'integrità dei dati per me a un piccolo overhead delle prestazioni, che verrebbe comunque perso dall'applicazione che esegue lo stesso controllo ... – lassombra

16

Hai dimenticato di aggiungere la clausola SET. In questo modo in realtà non cambia il valore.

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     SET NEW.meta = 'del'; 
    END IF; 
END$$ 
delimiter ;