यह व्यावसायिक तर्क होने की संभावना है, जो संभवत:आपके डेटा संग्रहण परत में नहीं है। हालांकि, फिर भी इसे triggers का उपयोग करके पूरा किया जा सकता है ।
आप एक BEFORE UPDATE
बना सकते हैं ट्रिगर जो एक त्रुटि उत्पन्न करता है यदि "लॉक" रिकॉर्ड अपडेट होने वाला है; चूंकि त्रुटि पहले . होती है ऑपरेशन किया जाता है, MySQL इसके साथ आगे बढ़ना बंद कर देता है। यदि आप भी रिकॉर्ड को हटाए जाने से रोकना चाहते हैं, तो आपको BEFORE DELETE
एक समान ट्रिगर बनाना होगा ।
यह निर्धारित करने के लिए कि कोई रिकॉर्ड "लॉक" है या नहीं, आप एक बूलियन locked
बना सकते हैं कॉलम:
ALTER TABLE my_table ADD COLUMN locked BOOLEAN NOT NULL DEFAULT FALSE;
DELIMITER ;;
CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.locked THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;
CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.locked THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;
DELIMITER ;
UPDATE my_table SET locked = TRUE WHERE ...;
ध्यान दें कि SIGNAL
MySQL 5.5 में पेश किया गया था। पुराने संस्करणों में, आपको कुछ गलत कार्रवाई करनी चाहिए जिसके कारण MySQL एक त्रुटि उत्पन्न करता है:मैं अक्सर एक गैर-मौजूद प्रक्रिया को कॉल करता हूं, उदा। CALL raise_error;
. के साथ
दोबारा, अगर आपको बिल्कुल जरूरी इस लॉजिक को स्टोरेज लेयर में रखें—और PK के अलावा किसी अन्य माध्यम से लॉक किए गए रिकॉर्ड की पहचान नहीं कर सकते—आप कर सकते हैं अपने ट्रिगर में परीक्षण को हार्ड-कोड करें; उदाहरण के लिए, id_column = 1234
. के साथ रिकॉर्ड को "लॉक" करने के लिए :
DELIMITER ;;
CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;
CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;
DELIMITER ;
लेकिन यह बिल्कुल भयानक है और मैं लगभग कुछ भी करूंगा जब भी संभव हो इससे बचने के लिए।