2014-10-09 13 views
5

रोकथाम Postgres 9.3 का उपयोग करना:Postgres नियम CTE प्रश्नों

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

CREATE TABLE foo (
    id INT PRIMARY KEY 
); 

CREATE TABLE bar (
    id INT PRIMARY KEY REFERENCES foo 
); 

CREATE RULE insertFoo AS ON INSERT TO foo DO INSERT INTO bar VALUES (NEW.id); 

WITH a AS (SELECT * FROM (VALUES (1), (2)) b) 
INSERT INTO foo SELECT * FROM a 

जब ऐसा चलाया जाता है, मैं त्रुटि

"ERROR: WITH cannot be used in a query that is rewritten by rules into multiple queries".

मुझे लगता है कि त्रुटि स्ट्रिंग के लिए खोज की है, लेकिन केवल स्रोत कोड के लिंक मिलेंगे करने में सक्षम हूँ: यहाँ एक उदाहरण है। मुझे पता है कि मैं इसके बजाय पंक्ति-स्तरीय ट्रिगर्स का उपयोग करके उपरोक्त निष्पादित कर सकता हूं, लेकिन ऐसा लगता है कि मुझे इसे स्टेटमेंट स्तर पर करने में सक्षम होना चाहिए। मैं लिखने योग्य CTE, का उपयोग क्यों नहीं कर सकते हैं जब इस तरह के प्रश्नों (इस मामले में) आसानी से के रूप में फिर से लिखा जा सकता है:

INSERT INTO foo SELECT * FROM (VALUES (1), (2)) a 

किसी को भी एक और तरीका पता है कि हासिल करेगी मैं के अलावा अन्य क्या करने की कोशिश कर रहा हूँ क्या 1) नियमों का उपयोग, जो पंक्तियों के ट्रिगर्स का उपयोग करके "साथ" प्रश्नों के उपयोग को रोकता है, या 2)? धन्यवाद,

+3

क्यों नहीं करते आप एक ट्रिगर का उपयोग करना चाहते हैं? –

+0

मेरा डेटाबेस अनुभव केवल 5 महीने है, इसलिए जब भी मैं किसी समस्या में भाग लेता हूं जिसे मैं वास्तव में पसंद करने वाले समाधान को नहीं समझ सकता, मुझे लगता है कि मुझे विशेषज्ञों से पूछना चाहिए ताकि मैं विभिन्न विकल्पों के बारे में जान सकूं। कुछ आसान के लिए, एक नियम प्रदर्शन कारणों के लिए जाने का तरीका प्रतीत होता था, लेकिन मुझे प्रश्नों में लिखने योग्य सीटीई का उपयोग करने में असमर्थ होने की सीमा पसंद नहीं है। –

+0

मुझे यह जोड़ना चाहिए कि मैं पसंद के समाधान के रूप में पंक्ति-स्तरीय ट्रिगर्स का उपयोग करने की योजना बना रहा हूं, जब तक कोई यहां SO पर बेहतर विकल्प प्रदान न करे। –

उत्तर

3

टीएल; डीआर: ट्रिगर का उपयोग करें, नियम नहीं।

आम तौर पर, नियमों पर ट्रिगर्स पसंद करते हैं, जब तक नियम पूरी तरह जरूरी नहीं होते। (जो, व्यावहारिक रूप से, वे कभी नहीं होते हैं।)

नियमों का उपयोग करने से समस्याएं ढेर होती हैं जो आपके जीवन को सड़क के नीचे जटिल रूप से जटिल बनाती हैं। आप यहां एक में भाग गए हैं। उदाहरण के लिए, एक और (प्रमुख) एक है, प्रभावित पंक्तियों की संख्या बहुत ही अंतिम प्रश्न के अनुरूप होगी - यदि आप कहीं पर फ़ंड पर भरोसा कर रहे हैं और आपकी क्वेरी गलत तरीके से रिपोर्ट कर रही है कि किसी भी पंक्ति से कोई पंक्ति प्रभावित नहीं हुई है, आप दर्दनाक कीड़े के लिए होंगे।

इसके अलावा, वहाँ Postgres का बहिष्कार कर के सामयिक बात सिरे से नियम है:

http://postgresql.nabble.com/Deprecating-RULES-td5727689.html