2011-03-21 34 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 उस पर पासवर्ड() फ़ंक्शन फिर से करना करने का प्रयास करेंगे। इसका पता लगाने के लिए, इस कोड का उपयोग

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

मुझे लगता है कि वह इस ट्रिगर में पासवर्ड एन्क्रिप्शन को लागू करने का मतलब है। –

+0

@yper - मैंने इसे छोड़ दिया लेकिन जिस हिस्से पर मैं हमला कर रहा था वह तथ्य था कि पुराने को संरक्षित करने के लिए, आपको वास्तव में ट्रिगर – RichardTheKiwi

+1

में इसे * बैक * सेट करना होगा, शायद वह 'डेलीमीटर' का उपयोग करके सही ढंग से सही नहीं है, जैसे कि उसके पिछले प्रश्न :) –

संबंधित मुद्दे