2008-10-15 5 views
11

मैं स्क्रिप्ट पर काम कर रहा हूं जो डेटाबेस स्कीमा अपडेट लागू करता है। मैंने प्रारंभ लेनदेन/प्रतिबद्धता का उपयोग कर अपनी सभी SQL अद्यतन स्क्रिप्ट सेट की हैं। मैं इन स्क्रिप्ट को कमांड लाइन पर psql पर पास करता हूं।postgresql 8.2 में नेस्टेड लेनदेन?

अब मुझे एक ही समय में और एक लेनदेन में कई स्क्रिप्ट लागू करने की आवश्यकता है। अब तक का एकमात्र समाधान है जो स्क्रिप्ट के मूल सेट से प्रारंभ लेनदेन/प्रतिबद्धता को हटाने के लिए है, फिर उन्हें एक नए प्रारंभ लेनदेन/प्रतिबद्ध ब्लॉक के अंदर एक साथ जाम करें। मैं फ्लाई पर ऐसा करने के लिए पर्ल स्क्रिप्ट लिख रहा हूं।

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

क्या इस उद्देश्य के लिए नेस्टेड लेनदेन करने या अनुकरण करने का कोई तरीका है? मेरे पास किसी भी त्रुटि पर स्वचालित रूप से जमानत करने के लिए चीजें सेट हैं, इसलिए यदि निम्न में से कोई भी विफल रहता है तो मुझे शीर्ष स्तर के लेन-देन में जारी रखने की आवश्यकता नहीं है।

उत्तर

5

अच्छी तरह से आपके पास SavePoints का उपयोग करके postgresql के अंदर नेस्टेड लेनदेन का उपयोग करने की संभावना है।

इस कोड उदाहरण लें:

CREATE TABLE t1 (a integer PRIMARY KEY); 

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS 
$$BEGIN 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (2); 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (3); 
    RETURN TRUE; 
EXCEPTION 
    WHEN integrity_constraint_violation THEN 
     RAISE NOTICE 'Rollback to savepoint'; 
     RETURN FALSE; 
END;$$; 

BEGIN; 

SELECT test_exception(); 
NOTICE: Rollback to savepoint 
test_exception 
---------------- 
f 
(1 row) 

COMMIT; 

SELECT count(*) FROM t1; 
count 
------- 
    0 
(1 row) 

हो सकता है कि यह तुम बाहर एक छोटा सा मदद मिलेगी।

+0

इस मामले में सेवपॉइंट्स का उपयोग करने के लिए, मुझे अपनी मौजूदा स्क्रिप्ट को संशोधित करना होगा और वे कैसे चलेंगे। इस विशेष मामले में, यदि ऐसा करने जा रहा था, तो मैं अपनी सभी स्क्रिप्ट से प्रारंभ/अंत लेनदेन ब्लॉक को हटा दूंगा और इसे अलग-अलग जोड़ दूंगा, जिससे इसे कई बार करना आसान हो जाता है। धन्यवाद! –

0

मैंने अपनी समस्या को बैंड से बाहर निकालने को समाप्त कर दिया है - मैं अपने प्रारंभ लेनदेन/प्रतिबद्ध कॉल को खत्म करने के लिए इनपुट स्क्रिप्ट को फिर से काम करने के लिए एक पर्ल स्क्रिप्ट का उपयोग करता हूं, फिर उन्हें सभी को एक फ़ाइल में धक्का देता हूं, जो इसे प्राप्त करता है अपना प्रारंभ लेनदेन/प्रतिबद्धता।