2013-02-08 13 views
8

Mam tabelę MySQL, nazwaną pracownikami.Wyzwalacz MySQL PRZED UPDATE - zmień wartość

ID name meta 
0  jack ok 
1  anne del 

Chcę napisać spust, który zapobiega wierszowi, w którym meta = "del" aktualizuje pole meta. Tak więc, jeśli robię:

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

Wiersz powinien być aktualizowany i meta będzie 'zajęty'

Ale kiedy zrobić:

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

Pole meta powinna nadal być „del "

próbowałem:

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

Ale MySQL zwraca z błędem składni. Jakieś pomysły?

Odpowiedz

3

Przegapiłeś ;

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 jest zła.

Alternatywą do wyzwalania jest poprzez dodanie kolejnego warunku AND

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

Spust nadal nie działa, ale zdecydowałem się na drugie rozwiązanie. Dziękuję Ci! –

+0

Nie ma za co ": D' –

+14

Dlaczego TRIGGER jest zły? Jest to bardzo potężne narzędzie, które administratorzy baz danych mogą użyć do egzekwowania reguł integralności danych. W środowisku, w którym ważna jest integralność danych (na przykład zapisy firmowe), wyzwalacze zapewniają cenne zasoby do ich egzekwowania, nawet w przypadku twórców aplikacji. Używam wyzwalaczy teraz nawet w moim osobistym rozwoju, ponieważ wymuszają one integralność danych dla mnie przy niewielkim obciążeniu wydajnościowym, które i tak zostałoby utracone przez aplikację wykonującą te same sprawdzenia ... – lassombra

16

zapomniałeś dodać klauzulę SET. W ten sposób tak naprawdę nie zmienia wartości.

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 ;