PostgreSQL: दृश्य से स्तंभ ड्रॉप करें


10

मेरे पास एक ऐसा स्थान है VIEWजहां मैं एक विकास स्क्रिप्ट बनाने का प्रयास कर रहा हूं, इसलिए मैं इसमें एक कॉलम जोड़ सकता हूं। वह हिस्सा ठीक काम करता है; स्तंभ ठीक जोड़ा गया। हालांकि, रिवर्स काम नहीं करता है; उस अंतिम जोड़े गए कॉलम को एक ERROR: cannot drop columns from viewसंदेश के साथ हटा दें । समस्या यह है कि इस विशेष दृश्य के कई संदर्भ हैं, दोनों से और इसलिए, मैं सिर्फ DROP CASCADEसार बात नहीं कर सकता !

क्या कोई कारण है कि मैं किसी दिए गए नए जोड़े गए कॉलम को नहीं हटा सकता VIEW? फिर, मैं इस कार्य को पूरा करने के लिए क्या कर सकता हूं?

(ध्यान दें: परिस्थितियां, यहां, वे क्या हैं, लेकिन मैं एक समान स्थिति को देख सकता हूं, उर्फ ​​स्तंभ को एक दृश्य से हटाकर, कई अन्य मामलों में।)


आपने पहली बार में कॉलम को कैसे जोड़ा? आप नहीं कर सकते ALTER VIEW ... ADD COLUMN। क्या आप उपयोग कर रहे हैं CREATE OR REPLACE VIEW? कृपया अपना कोड दिखाएं
क्रेग रिंगर

@ क्रेगिंगर, हां, CREATE OR REPLACE VIEWएक ही कॉलम के साथ, एक अतिरिक्त कॉलम को छोड़कर (क्योंकि एक ref'ed टेबल में एक नया कॉलम जोड़ा गया है, इसलिए दृश्य में इसे शामिल करना होगा)। "शक्ति हस्तांतरण", ref'ed मेज से स्तंभ को हटा तो VIEWभी करना पड़ता है नहीं अब और इसे वापस।
यानिक रोचॉन

जवाबों:


13

PostgreSQL (कम से कम 9.4 तक सही) वर्तमान में किसी कॉलम को हटाने का समर्थन नहीं करता है CREATE OR REPLACE VIEW

नई क्वेरी को वही कॉलम उत्पन्न करना चाहिए जो मौजूदा दृश्य क्वेरी (उसी क्रम में और समान डेटा प्रकारों के साथ समान कॉलम नाम) द्वारा उत्पन्न किए गए थे, लेकिन यह सूची के अंत में अतिरिक्त कॉलम जोड़ सकता है।

स्तंभों को छोड़ने के लिए समर्थन नहीं जोड़ा जा सकता है, इसका कोई मौलिक कारण नहीं है, लेकिन किसी ने भी इसे लागू करने के लिए आवश्यक कार्य नहीं किया है।

CREATE OR REPLACE VIEWसभी निर्भरताओं को पुनरावर्ती रूप से स्कैन करना होगा और यह सुनिश्चित करना होगा कि उनमें से किसी ने कॉलम को गिराया न जाए। अगर उन्होंने इसका इस्तेमाल किया है तो SELECT *यह *निर्भरता के विस्तार से कॉलम को हटाना होगा और फिर इसकी निर्भरता को भी स्कैन करेगा । ऐसा करने में बहुत सा काम शामिल है, और कुछ ऐसे क्षेत्र हैं जहाँ यह स्पष्ट नहीं है कि कॉलम को छोड़ने का तरीका विशेष रूप से तब व्यवहार करना चाहिए जब यह डंप और पुनः लोड के साथ बातचीत की बात आती है। इसलिए किसी को भी इस सुविधा को अभी तक लागू करने के लिए पर्याप्त नहीं चाहिए था। विकास के पैच और / या प्रायोजन स्वागत योग्य हैं।

आपको दृश्य और उस पर निर्भर होने वाली हर चीज को छोड़ना होगा, फिर उसे और उसकी निर्भरता को फिर से बनाना होगा। ( स्तंभ को किसी दृश्य में जोड़ने के लिए भी इसका उपयोग सही था; स्तंभ जोड़ने के लिए समर्थन 8.4 में पेश किया गया था)।

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


2
तो, आप क्या कह रहे हैं कि, जब भी कॉम्प्लेक्स रिश्तों के साथ एक बड़े एप्लिकेशन को एक कॉलम बदलने की आवश्यकता होती है, तो उसे संपूर्ण (या कम से कम अधिकांश भाग) डीडीएल को फिर से बनाने की आवश्यकता होती है? मुझे पोस्टग्रे के साथ बहुत अनुभव नहीं है, लेकिन mySQL से आने के बाद, मुझे कभी भी इस तरह की समस्याएं नहीं हुई हैं (Oracle, SQL सर्वर या MySQL के साथ), और यह मुझे अजीब लगता है कि परिवर्तन बस नहीं किया जा सकता है और यदि (तो) किसी भी) के बजाय निष्पादन समय पर फेंक दिया जाना चाहिए। यह सीमा काफी प्रतिबंधात्मक है।
यानिक रोचोन

@YanickRochon हां, यह एक दर्द है, और मैं इसे बेहतर देखना पसंद करूंगा। यदि आप ऐसा करने में सहायता करना चाहते हैं, तो उस पर धन देने के काम पर विचार करें; postgresql.org/support/professional_support देखें ।
क्रेग रिंगर

हम इस तरह के उद्यम के लिए बहुत छोटे हैं। लेकिन यह देखकर खुशी हुई कि यह कोई निश्चित विषय नहीं है।
यानिक रोचॉन

1
@YanickRochon मेला काफी यह TODO पर है - "जब अंतर्निहित तालिका में परिवर्तन होता है, तो दृश्य / नियम की अनुमति दें", wiki.postgresql.org/wiki/Todo#Views_and_Rules
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.