2008-11-20 7 views
19

मेरे पास पोस्टग्रेस्क्ल में यह ट्रिगर है कि मैं केवल काम नहीं कर सकता (कुछ नहीं करता)। समझ के लिए, वहाँ मैं इसे कैसे परिभाषित:डिबगिंग पोस्टग्रेस्क्ल ट्रिगर

CREATE TABLE documents (
    ... 
    modification_time timestamp with time zone DEFAULT now() 
); 

CREATE FUNCTION documents_update_mod_time() RETURNS trigger 
AS $$ 
    begin 
    new.modification_time := now(); 
    return new; 
    end 
$$ 
    LANGUAGE plpgsql; 

CREATE TRIGGER documents_modification_time 
    BEFORE INSERT OR UPDATE ON documents 
    FOR EACH ROW 
    EXECUTE PROCEDURE documents_update_mod_time(); 

अब यह थोड़ा अधिक दिलचस्प बनाने के .. तुम कैसे चलाता डीबग करूँ?

+0

इस सख्ती से संबंधित नहीं है, लेकिन क्या आप फिर भी यह हो सकता है आपके pgsql रोमांच में उपयोगी: http://stackoverflow.com/questions/430123/how-do-i-enable-the-postgresql-function -प्रोफाइलर – Kev

उत्तर

41
  1. एक ट्रिगर समारोह में निम्न कोड का प्रयोग करें, तो pgAdmin3 में 'संदेश' टैब या psql में उत्पादन देखने के लिए:

    RAISE NOTICE 'myplpgsqlval is currently %', myplpgsqlval;  -- either this 
    RAISE EXCEPTION 'failed'; -- or that 
    
  2. देखने के लिए जो वास्तव में कहा जाता हो ट्रिगर, कितने

    EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers 
    

    ध्यान दें कि यदि आपके ट्रिगर कहा जाता हो रही है नहीं है और आप विरासत उपयोग करें, यह वें हो सकता है: बार आदि, निम्नलिखित बयान पसंद का जीवन बचाने है आपने केवल मूल तालिका पर एक ट्रिगर परिभाषित किया है, जबकि ट्रिगर्स को स्वचालित रूप से बाल तालिकाओं द्वारा विरासत में नहीं मिला है।

  3. फ़ंक्शन के माध्यम से चरणबद्ध करने के लिए, आप डीजीगर का उपयोग pgAdmin3 में निर्मित कर सकते हैं, जो कि विंडोज़ पर डिफ़ॉल्ट रूप से सक्षम है; आपको बस इतना करना है कि में मिले कोड को निष्पादित करें ... \ 8.3 \ share \ contrib \ pldbgapi.sql जो डेटाबेस आप डिबगिंग कर रहे हैं, उसके खिलाफ pgAdmin3 को पुनरारंभ करें, अपने ट्रिगर फ़ंक्शन पर राइट-क्लिक करें, 'सेट ब्रेकपॉइंट' दबाएं, और उसके बाद एक कथन निष्पादित करें जो ट्रिगर को आग लगने का कारण बनता है, जैसे उपरोक्त अद्यतन विवरण।

+0

यह सुनिश्चित नहीं है कि यह अन्य प्लेटफ़ॉर्म पर ऐसा कैसे करें। इसके अलावा, मैं तीसरी विधि पहले साझा किया है होगा (यह * वास्तव में * आसान है!), लेकिन मैं के बाद यह सवाल मूल रूप से तैनात किया गया था इस बाहर एक सप्ताह पाया। – Kev

+1

पोस्टग्रेस 9.2 के साथ और pgAdmin के साथ प्रयास किया। ऊपर वर्णित निर्देशों का पालन करने के बाद भी कहीं भी सेट ब्रेकपॉइंट मेनू नहीं है। फ़ाइल भी ... \ 9.2 \ share \ extension \ pldbgapi-1.0.sql पर स्थित है। ओएस: विंडोज सर्वर 2008 – Dojo

3

आप इसे ट्रिगर करने के लिए अपने ट्रिगर फ़ंक्शन के अंदर 'नोटिस बढ़ाएं' कथन का उपयोग कर सकते हैं। ट्रिगर को डीबग करने के लिए बिल्कुल नहीं कहा जा रहा है एक और कहानी है।

यदि आप अपने ट्रिगर फ़ंक्शन के अंदर 'अपवाद बढ़ाएं' जोड़ते हैं, तो क्या आप अभी भी आवेषण/अपडेट कर सकते हैं?

इसके अलावा, यदि आपका अपडेट टेस्ट आपके सम्मिलित परीक्षण के समान लेनदेन में होता है, तो अब() समान होगा (क्योंकि यह प्रति लेनदेन में केवल एक बार गणना की जाती है) और इसलिए अद्यतन कुछ भी नहीं प्रतीत होता है। यदि ऐसा है, तो उन्हें अलग लेनदेन में करें, या यदि यह एक यूनिट टेस्ट है और आप ऐसा नहीं कर सकते हैं, तो clock_timestamp() का उपयोग करें।

मैं एक इकाई परीक्षण है कि कुछ समय के लेन-देन के बीच से जा रहा पर निर्भर करता है, तो इकाई परीक्षण की शुरुआत में मैं की तरह कुछ है है:

ALTER TABLE documents 
    ALTER COLUMN modification_time SET DEFAULT clock_timestamp(); 
फिर ट्रिगर में

, का उपयोग करें "सेट संशोधित = डिफ़ॉल्ट "।

तो आम तौर पर यह अतिरिक्त गणना नहीं करता है, लेकिन एक यूनिट परीक्षण के दौरान यह मुझे समय बीतने के अनुकरण के लिए पीजी_ स्लीप के साथ आवेषण करने की अनुमति देता है और वास्तव में डेटा में दिखाई देता है।

+0

अच्छा संकेत ... तो ऐसा लगता है कि समारोह को बुलाया नहीं जाता .. कोई विचार क्यों? –

+0

क्या आपके पास ट्रिगर फ़ंक्शन पर निष्पादन अनुमतियां हैं? – Kev

+0

आप सुरक्षित पक्ष पर रहने के लिए, विभिन्न वस्तुओं के नामों को पूरी तरह योग्य (स्कीमा नाम प्रीपेड) करना चाहते हैं। इसके अलावा आप शायद अपनी ट्रिगर परिभाषा के "INSERT" भाग को छोड़ सकते हैं, डिफ़ॉल्ट मान इस मामले का ख्याल रखता है। –

2

बाहर निकलता है मैं उपरोक्त समस्या में विरासत का उपयोग कर रहा था और इसका उल्लेख करना भूल गया।

डिबग करने के लिए क्या एक ट्रिगर कर रहा है निम्नलिखित कोड का उपयोग:

RAISE NOTICE 'test';  -- either this 
RAISE EXCEPTION 'failed'; -- or that 

देखने के लिए जो वास्तव में कहा जाता हो ट्रिगर, कितनी बार अब हर कोई है जो इस में भी चला सकता है के लिए, यहाँ कुछ डिबगिंग संकेत है आदि, निम्नलिखित बयान पसंद का जीवन बचाने है: केवल आग से चलाता है जब सटीक तालिका वे पर परिभाषित कर रहे हैं अद्यतन करने:

EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers 

तो फिर वहाँ एक बात मैंने पहले नहीं पता था है। यदि आप विरासत का उपयोग करते हैं, तो आपको उन्हें बच्चों की टेबल पर भी परिभाषित करना होगा!

+0

आपको उस tidbit को http://www.postgresql.org/docs पर पार करना चाहिए /8.3/interactive/ddl-inherit.html – Kev

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