2011-03-21 20 views
9

Estoy intentando escribir un disparador de actualización que solo actualizará una contraseña cuando se establezca una nueva contraseña en la declaración de actualización, pero me está costando trabajo intentar definir la sintaxis. Esto debería ser fácil, pero no estoy encontrando la solución.Disparo de MySQL si existe una condición

Aquí está mi código:

CREATE TRIGGER upd_user BEFORE UPDATE ON `user` 
FOR EACH ROW BEGIN 
    IF (NEW.password <> '') THEN 
     SET NEW.password = PASSWORD(NEW.password); 
    END IF; 
END; 

He intentado:

IF (NEW.password <> NULL) THEN 

IF (NEW.password) THEN 

IF NEW.password <> NULL THEN 

IF (NEW.password > 0) THEN 

IF (NEW.password != NULL) THEN 

y estoy seguro que muchas otras combinaciones, pero simplemente no está funcionando. ¿Alguien tiene alguna idea?

Respuesta

25

Creo que tiene intención de actualizarlo de nuevo a la contraseña OLD, cuando el NUEVO no se suministra.

DROP TRIGGER IF EXISTS upd_user; 

DELIMITER $$ 

    CREATE TRIGGER upd_user BEFORE UPDATE ON `user` 
    FOR EACH ROW BEGIN 
     IF (NEW.password IS NULL OR NEW.password = '') THEN 
      SET NEW.password = OLD.password; 
     ELSE 
      SET NEW.password = Password(NEW.Password); 
     END IF; 
    END$$ 

DELIMITER ; 

Sin embargo, esto significa que un usuario nunca puede borrar una contraseña.


Si el campo de contraseña (ya encriptada) se envía de vuelta en la actualización a MySQL, entonces no va a ser nulo o en blanco, y MySQL intentará volver a hacer la función de contraseña() sobre ella. Para detectar esto, use este código en su lugar

DELIMITER $$ 

    CREATE TRIGGER upd_user BEFORE UPDATE ON `user` 
    FOR EACH ROW BEGIN 
     IF (NEW.password IS NULL OR NEW.password = '' OR NEW.password = OLD.password) THEN 
      SET NEW.password = OLD.password; 
     ELSE 
      SET NEW.password = Password(NEW.Password); 
     END IF; 
    END$$ 

DELIMITER ; 
+0

Creo que quiere implementar el cifrado de la contraseña en este desencadenador. –

+0

@yper - Lo dejé, pero la parte que estaba atacando era el hecho de que para preservar lo viejo, en realidad tienes que configurarlo * atras * dentro del gatillo – RichardTheKiwi

+1

Probablemente no está usando correctamente el delimitador, como en su anterior pregunta :) –