2013-09-03 7 views
14

मैं अपने आंतरिक विकास सर्वर पर काम कर रहा हूं और MySQL 5.6.13 सर्वर पर MySQL Triggers बना रहा हूं। अब मेरे पास समस्या है ट्रिगर (कुल में लगभग 200) आंतरिक सर्वर पर DEFINER = root @% के साथ बनाए गए थे।थोक परिवर्तन कैसे करें MySQL Triggers DEFINER

अब मैं लाइव उत्पादन सर्वर पर जाना चाहता हूं। हालांकि हमारे लाइव सर्वर पर हम उपयोगकर्ता रूट के लिए इस पहुंच की अनुमति नहीं देते हैं। इसलिए कैसे मैं अपने सभी ट्रिगर बदल प्रकार भारी मात्रा में कर सकते हैं, इतना है कि यह Definer = root पढ़ता @localhost

उत्तर

36

एक तरह से यह करने के लिए:

1) एक फ़ाइल में ट्रिगर परिभाषाओं डंप

# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \ 
     --no-data --no-create-db --skip-opt test > /tmp/triggers.sql 

2) अपने पसंदीदा संपादक में triggers.sql फ़ाइल खोलें और DEFINER एस बदलने के लिए Find and Replace सुविधा का उपयोग करें। अद्यतन फ़ाइल सहेजें।

3) बहलाना फ़ाइल से चलाता है

# mysql < triggers.sql 
+1

मैक पर मुझे मैक ओएस एक्स पर "अज्ञात विकल्प: --ड-ड्रॉप-ट्रिगर" संदेश मिलता है Zend Server – Wouter

+2

यह केवल कुछ वातावरण में काम करता है। CentOS पर समुदाय 5.5.36 पर काम नहीं करता है ... "mysqldump: अज्ञात विकल्प '--add-drop-trigger' ' –

+0

यह मेरे लिए काम करता है। – Janath

1

स्वीकार किए जाते हैं जवाब मेरे लिए काम नहीं किया क्योंकि मेरे ग्राहकों के सबसे --add-drop-trigger function was added in 5.6 5.5 के साथ सर्वर पर होस्ट किया जाता है और बहुत ज्यादा नहीं मुझे इस बारे में क्या कर सकते हैं, और

इस पर मेरे सिर को टक्कर देने के बाद, मैं बस phpMyAdmin में गया जो ट्रिगर संपादन पृष्ठ पर निश्चित रूप से खुलासा करता है और मैंने बस 20 या तो ट्रिगर्स के लिए निश्चित संपादित किया है जो गलत थे - phpMyAdmin ट्रिगर को छोड़ देगा और फिर से बनाएगा नए निश्चित के साथ।

मुझे मिला एक और विकल्प एक पूर्ण mysqldump करना था, परिणामी फ़ाइल को संपादित करना, इसे एक नया डेटाबेस बनाने के लिए उपयोग करें, फिर नेविटैट जैसे टूल का उपयोग करें, मूल संरचना में वापस संरचना सिंक करने के लिए केवल वांछित ट्रिगर्स का चयन करें परिणामी तुलना सूची। यह मेरे लिए एक बहुत लंबी प्रक्रिया थी क्योंकि मुझे केवल 20 ट्रिगर्स संपादित करना पड़ा, लेकिन अगर मुझे सैकड़ों ट्रिगर अपडेट करना पड़ा तो यह तेज़ होगा।

+1

आप निश्चित रूप से डंप द्वारा बनाई गई फ़ाइल को संपादित कर सकते हैं और' ड्रॉप ट्रिगर 'जोड़ सकते हैं नाम का बाघ मौजूद है; ' – bartonlp

+0

हाँ, लेकिन यह थोड़ा और टाइपिंग है। अगर मेरे पास एक अच्छा डीबी तुलना उपकरण नहीं था जो ऐसा करने के लिए होगा। –

3

--add-ड्रॉप-ट्रिगर विकल्प का उपयोग कर के बिना:

currentUserDefiner='root' 
currentHostDefiner='localhost' 
newUserDefiner='user' 
newHostDefiner='localhost' 
db='myDb' 
mysqldump -u root --triggers --no-create-info --no-data --no-create-db --skip-opt $db \ 
| perl -0777 -pe 's/(\n\/\*.+?50003 TRIGGER `([^`]+)`)/\nDROP TRIGGER \2;\1/g' \ 
| perl -0777 -pe 's/(DEFINER[^`]+)'$currentUserDefiner'(`@`)'$currentHostDefiner'/\1'$newUserDefiner'\2'$newHostDefiner'/gi' \ 
> out.sql 
mysql -u root < out.sql 
1

एक और दृष्टिकोण इस जावा उपयोगिता का प्रयोग है। ध्यान दें कि यह एक काम प्रगति पर है क्योंकि वर्तमान संस्करण 1.0 कुछ सर्वर चर को साफ़ करता है। newdef

0

MySQL Workbench में एक विकल्प का उपयोग विषय पर एक और भिन्नता तो साथ MyQSL Workbench साथ आयात करते हैं, "mysqldump" का उपयोग कर पूरे डेटाबेस डंप एक सक्षम संपादक में डंप खोलते हैं, तो वांछित "Definer" से बदलें मिल रहा है, आयात स्क्रीन पर "डंप संरचना विकल्प" (v6.2) चयनित है।

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