जब मैं एक त्रुटि का सामना करता है तो मैं एक पोस्टग्रैज स्क्रिप्ट को कैसे रोक सकता हूं?


95

क्या यह निर्दिष्ट करने का कोई तरीका है कि किसी sql स्क्रिप्ट को निष्पादित करते समय यह स्क्रिप्ट पर पहली त्रुटि का सामना करते समय बंद हो जाता है, यह आम तौर पर जारी रहता है, पिछली त्रुटियों की परवाह किए बिना।

जवाबों:


156

मुझे लगता है कि .psqlrc को निम्नलिखित में जोड़ने का उपाय पूर्णता से दूर है

\set ON_ERROR_STOP on

वहाँ बहुत अधिक सरल और सुविधाजनक तरीका मौजूद है - पैरामीटर के साथ psql का उपयोग करें:

psql -v ON_ERROR_STOP=1

बेहतर भी उपयोग करने के लिए -Xपैरामीटर .psqlrc फ़ाइल उपयोग को बंद करना मेरे लिए पूरी तरह से काम करता है

पी एस Eisentraut से महान पोस्ट में पाया समाधान। धन्यवाद, पीटर! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ONयह भी काम करता है, कम से कम 9.2 के साथ। मुझे संदेह है कि बूलियन "सच" के किसी भी संस्करण की अनुमति है।
jpmc26

यह इंटरैक्टिव मोड में काम नहीं करता है, जिसने मुझे एक मिनट के लिए भ्रमित कर दिया।
सैम वाटकिंस

21

मुझे लगता है कि आप उपयोग कर रहे हैं psql, यह आपकी ~/.psqlrcफ़ाइल में जोड़ना आसान हो सकता है ।

\set ON_ERROR_STOP on

यह पहली त्रुटि पर गर्भपात कर देगा। यदि आपके पास यह नहीं है, तो भी एक लेन-देन के साथ यह आपकी स्क्रिप्ट को क्रियान्वित करता रहेगा लेकिन आपकी स्क्रिप्ट के अंत तक सब कुछ विफल रहेगा।

और आप शायद एक लेनदेन का उपयोग करना चाहते हैं जैसा कि पॉल ने कहा। psql --single-transaction ...यदि आप स्क्रिप्ट को बदलना नहीं चाहते हैं, तो यह भी किया जा सकता है ।

तो एक पूर्ण उदाहरण, अपने .psqlrc में ON_ERROR_STOP के साथ:

psql --single-transaction --file /your/script.sql

2
यहां तक ​​कि अगर लेन-देन विफल रहता है, तो psql कमांड का निकास स्थिति अभी भी 0. है
डॉ। पर्सन पर्सन II

4
वास्तव में, भले ही --single-transactionप्रयोग किया जाता है, फिर -v ON_ERROR_STOP=1भी एक गैर शून्य अस्तित्व की स्थिति के लिए आवश्यक है
bitek

8

यह बिल्कुल वैसा नहीं है जैसा आप चाहते हैं, लेकिन यदि आप अपनी स्क्रिप्ट के साथ शुरू करते हैं begin transaction;और समाप्त होते हैं end transaction;, तो यह वास्तव में पहली त्रुटि के बाद सब कुछ छोड़ देगा, और फिर यह त्रुटि से पहले की गई हर चीज को रोलबैक कर देगा।


सच है, लेकिन, यह अभी भी सब कुछ पार्स करता है। और अगर आप दूसरा लेन-देन करना चाहते हैं यदि पहला सफल हुआ, तो यह काम नहीं करेगा।
वाइल्डकार्ड

हां, और जारी रखने के लिए नहीं भूलना चाहिए जब इसका सामना डीडीएल से होता है टेबल इर्रेट्स बनाएं ... (संस्करण: पोस्टग्रेज 10)। हां, यह एक तालिका को छोड़ देता है और दूसरों पर चला जाता है ...
JL Peyret

0

मैं हमेशा सीधे मैनुअल का संदर्भ लेना पसंद करता हूं।

से PostgreSQL मैनुअल :

स्थिति से बाहर निकलें

psql 0 को शेल में देता है यदि यह सामान्य रूप से समाप्त हो जाता है, 1 यदि इसकी स्वयं की एक घातक त्रुटि होती है (जैसे मेमोरी से बाहर, फ़ाइल नहीं मिली), 2 यदि सर्वर से कनेक्शन खराब हो गया था और सत्र इंटरैक्टिव नहीं था, और 3 यदि एक स्क्रिप्ट में एक त्रुटि हुई और ON_ERROR_STOP चर सेट किया गया था।

डिफ़ॉल्ट रूप से यदि आप PostgreSQL सर्वर त्रुटि psql पर चल रहे sql कोड में कोई त्रुटि नहीं छोड़ेंगे। यह त्रुटि को पकड़ेगा और जारी रखेगा। यदि, जैसा कि ऊपर बताया गया है, आप ON_ERROR_STOPसेटिंग को चालू करते हैं, जब psql sql कोड में कोई त्रुटि पकड़ता है तो यह बाहर निकल जाएगा और 3शेल पर वापस आ जाएगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.