2009-05-01 18 views
5

क्या PostgreSQL पक्ष पर तालिका में पहली पंक्ति को हटाने से रोकना संभव है?तालिका में पहली पंक्ति को हटाने से कैसे रोकें (PostgreSQL)?

मेरे पास एक श्रेणी तालिका है और मैं डिफ़ॉल्ट श्रेणी को हटाने से रोकना चाहता हूं क्योंकि यह एप्लिकेशन को तोड़ सकता है। बेशक मैं इसे आसानी से एप्लिकेशन कोड में कर सकता हूं, लेकिन डेटाबेस में ऐसा करना बेहतर होगा।

मुझे लगता है कि इसे हटाने के कथन पर नियमों के साथ कुछ करना है, लेकिन मुझे दस्तावेज़ में मेरी समस्या के दूरस्थ रूप से कुछ भी नहीं मिला।

उत्तर

6

सबसे अच्छा तरीका है मैं इसे पूरा करने के लिए इस मेज पर एक नष्ट ट्रिगर बनाने के द्वारा है देखते हैं। असल में, आपको यह सुनिश्चित करने के लिए एक संग्रहित प्रक्रिया लिखनी होगी कि यह 'डिफ़ॉल्ट' श्रेणी हमेशा मौजूद रहेगी, और फिर इस तालिका पर ट्रिगर ऑन डिलीट ईवेंट का उपयोग करके इसे लागू करें। ऐसा करने का एक अच्छा तरीका एक प्रति-पंक्ति ट्रिगर बनाता है जो गारंटी देगा कि DELETE ईवेंट पर 'डिफ़ॉल्ट' श्रेणी पंक्ति कभी नहीं हटाई जाएगी।

कृपया और ट्रिगर के बारे में PostgreSQL के दस्तावेज़ संग्रहित प्रक्रियाओं की जाँच:

http://www.postgresql.org/docs/8.3/interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive/plpgsql.html

वहाँ भी इस विकि में मूल्यवान उदाहरण है:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

9

आप तालिका पर trigger हटाएं से पहले परिभाषित करना चाहते हैं। जब आप पंक्ति को हटाने का प्रयास करते हैं (या तो पीके द्वारा मिलान करते हैं या अलग "सुरक्षा" बूलियन कॉलम रखते हैं), RAISE अपवाद।

मैं PostgreSQL वाक्य रचना से परिचित नहीं हूँ, लेकिन it looks like यह कैसे आप यह कर होता है:

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$ 
    BEGIN    
     IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN 
      RAISE EXCEPTION 'cannot delete default category'; 
     END IF; 

    END; 
$check_del_cat$ LANGUAGE plpgsql; 

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/ 
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat(); 
+0

अपने जवाब के लिए धन्यवाद। आप और Macalendas दोनों दे दी है उपयोगी उत्तर इसलिए "स्वीकृत" उत्तर चुनना मुश्किल था, लेकिन मैंने इसे नए उपयोगकर्ताओं को इस अद्भुत साइट में भाग लेने के लिए प्रोत्साहित करने के लिए मैकलेन्डास को देने का फैसला किया। धन्यवाद! –

+0

कोई समस्या नहीं है और खुशी है कि मैं मदद कर सकता हूं। मैंने अभी भी एक विसंगति बंद कर दी है टैग में उद्धरण दें ताकि लिंक ठीक से काम कर सकें। –

9

आप नियम प्रणाली के बारे में सोचने के बारे में सही थे। Here आपकी समस्या से मेल खाने वाले एक उदाहरण का लिंक है। यह ट्रिगर्स से भी सरल है:

create rule protect_first_entry_update as 
    on update to your_table 
    where old.id = your_id 
    do instead nothing; 
create rule protect_first_entry_delete as 
    on delete to your_table 
    where old.id = your_id 
    do instead nothing; 

कुछ उत्तर एक बिंदु याद आती है: भी संरक्षित पंक्ति को अद्यतन करने के लिए प्रतिबंधित कर दिया गया है। अन्यथा कोई पहले संरक्षित पंक्ति को अपडेट कर सकता है जैसे कि यह अब वर्जित डिलीट मानदंड को पूरा नहीं करता है, और फिर कोई अपडेट की गई पंक्ति को हटा सकता है क्योंकि यह अब सुरक्षित नहीं है।

+0

यह सुनिश्चित नहीं है कि यह उत्तर अधिक प्यार क्यों नहीं प्राप्त कर रहा है लेकिन सुरक्षा नियम शानदार हैं! +1: –

0

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

क्या मुझे नियम या ट्रिगर का उपयोग करना चाहिए?

सरकारी डॉक्स से: "चीजें हैं जो दोनों के द्वारा लागू किया जा सकता है, जो सबसे अच्छा है के लिए डेटाबेस के उपयोग पर निर्भर करता है एक ट्रिगर एक बार किसी भी प्रभावित पंक्ति के लिए निकाल दिया गया है एक नियम क्वेरी manipulates या एक उत्पन्न करता है।। अतिरिक्त क्वेरी। इसलिए यदि एक बयान में कई पंक्तियां प्रभावित होती हैं, तो एक अतिरिक्त आदेश जारी करने वाला नियम प्रत्येक ट्रिगर के लिए बुलाए जाने वाले ट्रिगर से तेज़ होने की संभावना है और इसे कई बार अपने परिचालन निष्पादित करना होगा।हालांकि, ट्रिगर दृष्टिकोण धारणात्मक नियम दृष्टिकोण की तुलना में कहीं आसान है, और novices के अधिकार प्राप्त करने के लिए आसान है। "

जानकारी के लिए दस्तावेज़ देख सकेंगे।
http://www.postgresql.org/docs/8.3/interactive/rules-triggers.html

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