কোনও পোস্টগ্রিস স্ক্রিপ্ট যখন ত্রুটির মুখোমুখি হয় আমি কীভাবে থামাতে পারি?


96

স্ক্রিপ্ট স্ক্রিপ্টটি কার্যকর করার সময় স্ক্রিপ্টে প্রথম ত্রুটির মুখোমুখি হওয়ার সময় এটি বন্ধ হয়ে যায় তা নির্দিষ্ট করার কোনও উপায় আছে কি না, এটি পূর্ববর্তী ত্রুটিগুলি নির্বিশেষে সাধারণত চালিয়ে যায়।

উত্তর:


158

আমি মনে করি .psqlrc এ অনুসরণ করার সমাধানটি নিখুঁততা থেকে অনেক দূরে

\set ON_ERROR_STOP on

আরও অনেক সহজ এবং সুবিধাজনক উপায় রয়েছে - প্যারামিটার সহ পিএসকিএল ব্যবহার করুন:

psql -v ON_ERROR_STOP=1

-X.psqlrc ফাইলের ব্যবহার বন্ধ করে প্যারামিটার ব্যবহার করা আরও ভাল । আমার জন্য পুরোপুরি কাজ করে

পিএস সমাধানটি পিটার আইজেনট্রাট থেকে দুর্দান্ত পোস্টে পাওয়া গেছে। আপনাকে ধন্যবাদ, পিটার! http://petereisentraut.blogspot.com/2010/03/running-sql-scriptts-with-psql.html


8
-v ON_ERROR_STOP=ONকমপক্ষে 9.2 দিয়েও কাজ করে। আমি সন্দেহ করি যে বুলিয়ান "ট্রু" এর কোনও রূপের অনুমতি রয়েছে।
jpmc26

এটি ইন্টারেক্টিভ মোডে কাজ করে না, যা আমাকে এক মিনিটের জন্য বিভ্রান্ত করেছিল।
স্যাম ওয়াটকিন্স

22

আমি ধরে নিচ্ছি আপনি ব্যবহার করছেন psql, এটি আপনার ~/.psqlrcফাইলে যুক্ত হতে পারে ।

\set ON_ERROR_STOP on

এটি প্রথম ত্রুটিতে এটি বাতিল করতে সক্ষম করে। আপনার যদি এটি না থাকে, এমনকি কোনও লেনদেনের সাহায্যে এটি আপনার স্ক্রিপ্টটি কার্যকর করতে থাকবে তবে আপনার স্ক্রিপ্টের শেষ না হওয়া পর্যন্ত সবকিছুতে ব্যর্থ।

এবং আপনি সম্ভবত পল যেমন বলেছিলেন তেমন কোনও লেনদেন ব্যবহার করতে চান। যা দিয়েও করা যায়psql --single-transaction ...আপনি স্ক্রিপ্ট পরিবর্তন করতে না চাইলে ।

আপনার .psqlrc এ ওপেন_আরআরআরপিওপি সহ একটি সম্পূর্ণ উদাহরণ:

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

4
এমনকি যদি লেনদেন ব্যর্থ হয়, তবে পিএসকিএল কমান্ডের প্রস্থান স্থিতিটি এখনও 0
ড। ব্যক্তি ব্যক্তি II

5
প্রকৃতপক্ষে, এমনকি যদি --single-transactionব্যবহার করা -v ON_ERROR_STOP=1হয় তবে শূন্যের অস্তিত্বের স্থিতির জন্য এখনও প্রয়োজনীয়
অ্যালেক্স বিটেক

8

এটি আপনি যা চান ঠিক তা নয়, তবে আপনি যদি আপনার স্ক্রিপ্টটি শুরু করে begin transaction;এবং শেষ করেন end transaction;, এটি আসলে প্রথম ত্রুটির পরে সমস্ত কিছু এড়িয়ে যাবে এবং তারপরে এটি ত্রুটির আগে যা কিছু করেছিল তা রোলব্যাক করবে।


সত্য, তবে, এটি এখনও সমস্ত কিছু পার্স করে। এবং আপনি যদি প্রথম সফল হন তবেই আপনি দ্বিতীয় লেনদেন করতে চান , এটি কার্যকর হবে না।
ওয়াইল্ডকার্ড

হ্যাঁ, এবং ডিডিএল-এর মুখোমুখি হওয়ার সময় অবিরতটি ভুলে যাবেন না সারণী ত্রুটিগুলি তৈরি করুন ... (সংস্করণ: পোস্টগ্র্যাগ 10)। হ্যাঁ, এটি একটি টেবিল এড়িয়ে অন্যের দিকে যায় ...
জে এল পেয়ারেট

0

আমি সর্বদা সরাসরি ম্যানুয়ালটি উল্লেখ করতে চাই।

থেকে পোস্টগ্রি ম্যানুয়াল :

প্রস্থান স্থিতি

পিএসকিএল 0 টি শেলটি স্বাভাবিকভাবে শেষ হলে 0 টি ফিরে আসে, 1 যদি নিজের একটি মারাত্মক ত্রুটি ঘটে তবে (উদাহরণস্বরূপ মেমরির বাইরে, ফাইলটি পাওয়া যায়নি), 2 যদি সার্ভারের সংযোগ খারাপ হয়ে যায় এবং সেশনটি ইন্টারেক্টিভ না হয় এবং 3 একটি স্ক্রিপ্টে একটি ত্রুটি ঘটেছে এবং চলক ON_ERROR_STOP সেট করা হয়েছিল _ST

ডিফল্টরূপে যদি আপনি পোস্টগ্রিএসকিউএল সার্ভারের ত্রুটিটি চালাচ্ছেন এমন এসকিএল কোডটি ত্রুটি ত্যাগ করবে না। এটি ত্রুটিটি ধরবে এবং চালিয়ে যাবে। উপরে বর্ণিত হিসাবে যদি আপনি ON_ERROR_STOPসেটিংসটি সেট করেন তবে পিএসএইচএল এসকিএল কোডটিতে একটি ত্রুটি পেলে এটি প্রস্থান 3করে শেলের কাছে ফিরে আসবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.