Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL पंक्ति को केवल पढ़ने के लिए कैसे सेट करें?

यह व्यावसायिक तर्क होने की संभावना है, जो संभवत:आपके डेटा संग्रहण परत में नहीं है। हालांकि, फिर भी इसे 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 ;

लेकिन यह बिल्कुल भयानक है और मैं लगभग कुछ भी करूंगा जब भी संभव हो इससे बचने के लिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:GROUP_CONCAT एक ORDER BY COUNT के साथ?

  2. Mysql json आधारित ट्रेंडिंग टैग कार्यान्वयन

  3. रूबी डेटाटाइम MySQL तुलना के लिए उपयुक्त है

  4. MySQL:उस तालिका से डेटा का चयन करें जहां दिनांक वर्तमान सप्ताह और वर्तमान माह में आता है

  5. सी # MySQL कनेक्शन पूलिंग