2011-03-21 21 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