2011-03-21 145 views
9

我正试图编写更新触发器,它只会在更新语句中设置新密码时更新密码,但我在试图确定语法时遇到了可怕的时间。这应该是一件容易的事,但我只是找不到解决方案。如果条件存在MySQL触发器

这里是我的代码:

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; 

我已经试过:

IF (NEW.password <> NULL) THEN 

IF (NEW.password) THEN 

IF NEW.password <> NULL THEN 

IF (NEW.password > 0) THEN 

IF (NEW.password != NULL) THEN 

而且我敢肯定,许多其他的组合,但它只是不工作。有没有人有任何见解?

回答

25

我想你的意思是将其更新回OLD密码,当新的没有提供。

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 ; 

但是,这意味着用户不能填空密码。


如果密码字段(已经加密)在mySQL更新中发回,那么它不会为空或空白,并且MySQL将尝试重做其上的Password()函数。要检测此,请使用此代码而不是

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

我认为他意味着在此触发器中实施密码加密。 – 2011-03-21 01:40:37

+0

@yper - 我把它留了下来,但是我所攻击的部分是为了保存旧的,你实际上必须在触发器内设置* back * – RichardTheKiwi 2011-03-21 01:46:01

+1

他可能不正确地使用'delimiter',就像他之前问题:) – 2011-03-21 01:57:59