MySQL

2011-12-30 21 views
12

में हटाने से पंक्ति को सुरक्षित रखें मैं कुछ पंक्तियों को हटाने से बचाने के लिए चाहता हूं और मैं अपने आवेदन के तर्क के बजाय ट्रिगर का उपयोग करके इसे करना पसंद करता हूं। मैं MySQL डेटाबेस का उपयोग कर रहा हूँ।MySQL

क्या मैं के साथ आया था यह है:

DELIMITER $$ 

DROP TRIGGER `preserve_permissions`$$ 

USE `systemzarzadzaniareporterami`$$ 

CREATE TRIGGER `preserve_permissions` 
AFTER DELETE ON `permissions` 
FOR EACH ROW 
BEGIN 
IF old.`userLevel` = 0 AND old.`permissionCode` = 164 THEN 
    INSERT INTO `permissions` SET `userLevel`=0, `permissionCode`=164; 
END IF; 
END$$ 

DELIMITER ; 

लेकिन जब मैं हटाने का प्रयोग करें यह मुझे एक त्रुटि देता है:

DELETE FROM `systemzarzadzaniareporterami`.`permissions` 
WHERE `userLevel` = 0 AND `permissionCode` = 164; 

Error Code: 1442. Can't update table 'permissions' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

वहाँ एक और तरीका ऐसा करने के लिए है?

उत्तर

13

एक समाधान आपकी अनुमति तालिका में एक विदेशी कुंजी के साथ एक बाल तालिका बनाने के लिए होगा, और व्यक्तिगत पंक्तियों का संदर्भ देने वाली निर्भर पंक्तियां जोड़ें जिसके लिए आप हटाना बंद करना चाहते हैं।

CREATE TABLE preserve_permissions (
    permission_id INT PRIMARY KEY, 
    FOREIGN KEY (permission_id) REFERENCES permissions (permission_id) 
); 

INSERT INTO perserve_permissions (permission_id) VALUES (1234); 

अब आप आईडी 1234 के साथ अनुमतियों से पंक्ति को हटा नहीं सकते हैं, क्योंकि यह विदेशी कुंजी निर्भरता का उल्लंघन करेगा।

यदि आप वास्तव में एक ट्रिगर के साथ ऐसा करना चाहते हैं, तो जब कोई इसे हटाने का प्रयास करता है तो पंक्ति को दोबारा डालने की बजाय, हटाएं को हटा दें। MySQL 5.5 में SIGNAL सुविधा है जो एक संग्रहित प्रो या ट्रिगर में SQLEXCEPTION को बढ़ाने के लिए है।

यदि आप MySQL 5.0 या 5.1 का उपयोग करते हैं, तो आप सिग्नल का उपयोग नहीं कर सकते हैं, लेकिन आप एक ट्रिक का उपयोग कर सकते हैं जो आपके ट्रिगर में स्थानीय आईएनटी चर घोषित करने के लिए है और इसे स्ट्रिंग मान असाइन करने का प्रयास करें। यह डेटा प्रकार का संघर्ष है, इसलिए यह एक त्रुटि फेंकता है और ट्रिगर उत्पन्न करने वाले ऑपरेशन को रोक देता है। अतिरिक्त चालाक चाल स्ट्रिंग में एक उचित त्रुटि संदेश निर्दिष्ट करने के लिए है जिसे आप INT में भरने का प्रयास करते हैं, क्योंकि उस स्ट्रिंग को त्रुटि में रिपोर्ट किया जाएगा! :-)

10

एक नई तालिका बनाएं और एक विदेशी कुंजी बनाएं। हटाएं - प्रतिबंधित पर विदेशी कुंजी सेट करें।

CONSTRAINT FOREIGN KEY fk_restriction (restriction_col) 
table_to_restrict (restricted_id) ON DELETE RESTRICT ON UPDATE CASCADE 

नोट: यह MyISAM, BlackHole, आदि इंजन के साथ किया जाना संभव नहीं है। InnoDB और वंशज इंजन के साथ प्रयोग करें।

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

  • कोई संबंधित समस्या नहीं^_^