2009-04-21 13 views
16

मुझे MySQL के लिए सेटअप स्क्रिप्ट लिखने की आवश्यकता है (आमतौर पर mysql कंसोल से 'स्रोत [फ़ाइल]' का उपयोग करके चलाया जाता है) जो मौजूदा डेटा पर आंशिक रूप से निर्भर करता है, और वातावरण में अंतर होता है, जिसका अर्थ है कि कभी-कभी स्क्रिप्ट विफल हो जाती है। एक आम मामला यह है कि एक चयन के साथ 'सेट' कथन (आईडी का पता लगाने के लिए) कुछ भी ढूंढने में विफल रहता है; कंसोल सेट के लिए मूल्य सेट करता है। इस मामले में मैं स्क्रिप्ट को असफल करना चाहता हूं; मैंने सुना है कि यह एक त्रुटि (अन्य डीबी के साथ) उठाकर किया जाएगा। हालांकि ऐसा लगता है जैसे MySQL को ऐसा करने का कोई तरीका नहीं था।MySQL स्क्रिप्ट्स को निष्पादित करने का तरीका (शायद त्रुटि बढ़ाना)?

ऐसी स्थितियों में विफलता को मजबूर करने के अच्छे तरीके हैं? चूंकि चीजें अब अपडेट हो जाएंगी जब सम्मिलित नल का उपयोग करने का प्रयास करता है, लेकिन यहां तक ​​कि यह स्क्रिप्ट को समाप्त नहीं करता है। आदर्श रूप से यह एक समस्या का सामना करने के तुरंत बाद विफल हो जाएगा और समाप्त हो जाएगा।

+1

डुप्लिकेट होने का अनुमान है: http://stackoverflow.com/questions/465727/raise-error-within-mysql-function/466826 –

+0

हम्म। यह संबंधित है लेकिन मुझे यकीन नहीं है कि यह एक डुप्लिक है, क्योंकि मैं mysql कंसोल से एसक्यूएल चला रहा हूं, और संग्रहित प्रक्रियाएं नहीं हैं। लेकिन हो सकता है कि मैं यहां गलतफहमी और भिन्नताएं (क्या कंसोल केवल मूल रूप से चीजों को चल रहा है जैसे संग्रहीत प्रोसेस निष्पादित होंगे?)। किसी भी दर पर लिंक के लिए धन्यवाद। – StaxMan

+1

नए विकल्प उपलब्ध हो सकते हैं MySQL 6 देखें http://bugs.mysql.com/bug.php?id=35634 – KCD

उत्तर

7

मुझे लगता है कि आप जो सामना कर रहे हैं वह MySQL कंसोल की एक सीमा है। बयानों की एक सूची को देखते हुए, MySQL कंसोल किसी भी त्रुटि उत्पन्न किए बिना निष्पादित करता है। यहां तक ​​कि यदि आपने पिछले कुछ टिप्पणियों का उल्लेख किया है, तो कुछ त्रुटि-उठाए गए सुझावों को लागू किया गया है, तो ऐसी त्रुटि उत्पन्न होने पर MySQL कंसोल निष्पादित नहीं करेगा।

मुझे लगता है कि आपके पास उस समस्या के लिए एक स्क्रिप्टिंग भाषा लागू करने के लिए संसाधन नहीं हैं जो आपके लिए SQL को निष्पादित कर सकता है और त्रुटियों को संभाल सकता है। मुझे लगता है कि इस मामले में, आपको केवल MySQL कंसोल की तुलना में अधिक मजबूत टूल की आवश्यकता है।

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

यदि आप क्वेरी ब्राउज़र खोलते हैं, तो आपको अपने MySQL डेटाबेस का एक सभ्य जीयूआई दृश्य मिलता है। फ़ाइल -> अपनी एसक्यूएल स्क्रिप्ट खोलने के लिए ओपन स्क्रिप्ट, फिर निष्पादन बटन का उपयोग करें।

आपको एक अच्छी प्रगति पट्टी मिलती है, और यदि कोई क्वेरी विफल हो जाती है, तो इसकी आवाज़ से अधिक महत्वपूर्ण बात यह है कि स्क्रिप्ट निष्पादन रोकता है और विफल क्वेरी को हाइलाइट करता है। आप इसे छोड़ना और जारी रखना चुन सकते हैं, या यहां तक ​​कि अपने डेटा को मैन्युअल रूप से संशोधित कर सकते हैं और स्क्रिप्ट के आगे कहीं और से शुरू कर सकते हैं।

मैंने व्यवस्थापक के बारे में पता लगाने और कोशिश करने के तुरंत बाद MySQL कंसोल को तुरंत छोड़ दिया।

+0

मुझे यह स्पष्ट करना चाहिए कि यह विंडोज संस्करण कार्यक्षमता है जिसका मैं वर्णन कर रहा हूं। मैंने लिनक्स/मैक संस्करणों का अनुभव नहीं किया है, लेकिन मुझे लगता है कि वे अपने क्वेरी ब्राउज़र टूल में भी रोक लगाएंगे। – zombat

+0

धन्यवाद! मेरी इच्छा है कि कंसोल थोड़ा अधिक फीचर-पूर्ण था, लेकिन मुझे निश्चित रूप से माईएसQL प्रशासक को देखने की ज़रूरत है। – StaxMan

+0

@ ज़ोंबैट, आप phpMyAdmin, Navicat, HeidiSQL, SQLyog, SQLWave, Toad, dbForge जैसे बेहतर लोगों के बजाय वर्कबेंच का उपयोग क्यों करते हैं? – Pacerier

1

ऐसा लगता है कि KILL QUERY आपको जो चाहिए वह करना चाहिए।

+0

लिंक के लिए धन्यवाद, यह दिलचस्प और उपयोगी है, लेकिन मुझे जो चाहिए वह काफी नहीं है। मेरे लिए समस्या यह नहीं है कि एक प्रश्न को समाप्त करने की आवश्यकता है लेकिन बयान में से कोई एक विफल होने पर उस स्क्रिप्ट (विवरणों का अनुक्रम) विफल होने की आवश्यकता है। – StaxMan

13

मुझे एक ही समस्या थी और जीयूआई मेरे लिए एक विकल्प नहीं है।

select if(@error, sfKillConnection(), 0); 

आप शायद के साथ mysql ग्राहक शुरू करने के लिए की आवश्यकता होगी:

DELIMITER $$ 

    DROP FUNCTION IF EXISTS sfKillConnection $$ 

    CREATE FUNCTION sfKillConnection() RETURNS INT 
    BEGIN 

     SELECT connection_id() into @connectionId; 
     KILL @connectionId; 
     RETURN @connectionId; 
    END $$ 


    DELIMITER ; 

यह एक प्रक्रिया के बजाय एक समारोह तो यह इस तरह एक स्क्रिप्ट में कहा जा सकता है है: यहाँ मैं इसे कैसे हल किया है --disable-reconnect विकल्प।

+0

अरे, यह साफ है! प्रशंसा! –

+0

वास्तव में यह '@@ error_count' के साथ अधिक प्रत्यक्ष होगा। – Adam

2

यहां कुछ अपग्रेड कमांड निष्पादित करने का एक तरीका है, यदि कोई निश्चित संस्करण हो।

यह बदसूरत है लेकिन यह सब मैं mysql 5 के लिए सुझाव दे सकता हूं।

DELIMITER $$ 
DROP FUNCTION IF EXISTS `Upgrade_Build`$$  
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30) 
BEGIN 
    IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN 
    UPDATE `pages` 
     SET `component_parameters` = 
     REPLACE(`component_parameters`,'folderviewer_','folder_viewer.'); 
    UPDATE `system` 
     SET `db_version` = bversion+1; 
    return CONCAT('Success: ',bversion,' > ',bversion+1); 
    ELSE 
    return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`)); 
    END IF; 
END$$ 
DELIMITER ; 

यह ऐसा करने का उपयोग करें:

सफल:: 1327> 1328

भागो

SELECT Upgrade_Build(1327); 

आप इस करता है, तो वर्तमान संस्करण था 1327 की तरह कुछ देखेंगे यह दूसरी बार है और आप देखेंगे:

असफल - संस्करण 1328

आशा है कि यह किसी के लिए उपयोग की जाए।

0

यहाँ एक कम माथे दृष्टिकोण है:

मुझे यकीन है कि @search_admin_realnameprofiles तालिका में एक रिकॉर्ड के अनुरूप था बनाने के लिए आवश्यक; यदि नहीं, तो मैं अपनी लिपि को रोकना चाहता था।

तो मैंने किया था यह:

select @search_admin_id:= userid 
from profiles 
where [email protected]_admin_realname 
; 
# test that @search_admin_id is not null; 
# if it is, then the insert will fail and script will abort. 
create temporary table t_search_admin_id (search_admin_id mediumint(9) not null); 
insert into t_search_admin_id (search_admin_id) values (@search_admin_id); 

केवल दोष यह है कि मैं वास्तव में त्रुटि संदेश :(

+0

दिलचस्प, धन्यवाद! – StaxMan

5

MySQL Workbench अब MySQL प्रशासक की जगह को बदल नहीं सकते है

प्रयोग करें 'टॉगल। चाहे विफल कथन के बाद SQL स्क्रिप्ट का निष्पादन जारी रखना चाहिए

Toggle whether execution of SQL script should continue after failed statements

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

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