क्यों आप संग्रहीत प्रक्रिया में डायनामिक SQL से बचना चाहते हैं?


13

मैंने सुना है कि आप डायनेमिक SQL का उपयोग नहीं करना चाहते हैं। क्या आप कुछ ठोस उदाहरण या वास्तविक जीवन का उदाहरण दे सकते हैं? व्यक्तिगत रूप से, मैं इसे अपने डेटाबेस में कुछ बार कोड करता हूं। मुझे लगता है कि यह ठीक है क्योंकि यह लचीलापन है। मेरा अनुमान SQL इंजेक्शन या प्रदर्शन के बारे में है। और कुछ?

जवाबों:


7

डायनेमिक SQL का उपयोग करने में कुछ भी गलत नहीं है अगर आपको करना चाहिए। वास्तव में कुछ परिस्थितियों में यह एकमात्र विकल्प है जो आपके पास है। यह एक सिफारिश के रूप में इसका उपयोग नहीं करने के लिए अधिक है क्योंकि यह एक SQL इंजेक्शन के लिए नेतृत्व कर सकता है अगर आपका इनपुट sanitized नहीं है, और हाँ डायनेमिक SQL का उपयोग मॉड्यूल में किया जाता है जिसे अक्सर कहा जाता है यह प्रदर्शन के लिए हानिकारक हो सकता है।

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

यदि आपके प्रदर्शन के बारे में चिंतित हैं; झसे आज़माओ। अगर आपकी सुरक्षा को लेकर चिंता है; अपने इनपुट को मान्य करें। कोई सही या गलत नहीं है - केवल आप उस समय आपके पास उपलब्ध जानकारी और साधनों के आधार पर अपने सर्वोत्तम निर्णय का उपयोग करते हैं।


5

डायनेमिक SQL एक टूल है। और एक उपकरण के रूप में, इसके कुछ अनुप्रयोग हैं - प्रशासनिक कार्यों के लिए यह एक आशीर्वाद है, उदाहरण के लिए।

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

मैं यहाँ विस्तार से दर्ज नहीं करूँगा, इसलिए मैं गतिशील SQL मुद्दों पर एक उत्कृष्ट लेख की सिफारिश करूँगा: MVP Erland Sommarskog द्वारा गतिशील SQL का अभिशाप और आशीर्वाद


1
मैं उस लिंक को साझा करने जा रहा था, यह गतिशील SQL का उपयोग करने पर विचार करने वाले किसी भी व्यक्ति के लिए पढ़ना चाहिए।
HLGEM

1

यह सबसे dbms सुविधाओं की तरह है, अगर आप इसे सही स्थिति में उपयोग करते हैं तो यह अच्छी तरह से काम करता है, गलत स्थिति यह इसे खराब करती है।

पेशेवरों: कुछ चीजें इसके बिना नहीं हो सकतीं। आमतौर पर मैंने इसे केवल प्रशासनिक कार्य के लिए पाया है, न कि एप्लिकेशन कोड के लिए। कुछ सिस्टम कमांड इनपुट के रूप में मापदंडों का उपयोग करने की अनुमति नहीं देते हैं। इसलिए उदाहरण के लिए अगर मुझे अज्ञात डेटाबेस के साथ कई उदाहरणों पर, प्रत्येक डेटाबेस के खिलाफ एक स्प्रो के माध्यम से कुछ चलाने की जरूरत है, और कमांड पैरामीटर को स्वीकार नहीं करता है, तो मैं आमतौर पर गतिशील एसक्यूएल के माध्यम से इसे हल करता हूं। हालाँकि यह MSSQL की तुलना में Sybase ASE में अधिक है।

विपक्ष: मैं इसमें ज्यादा नहीं जाऊंगा, क्योंकि मुझे लगता है कि हम सभी इसे पहले से ही जानते हैं, लेकिन गलत तरीके से उपयोग किए जाने पर SQL इंजेक्शन के लिए कुछ जोखिम हो सकता है। मेरे लिए एक बड़ा सवाल यह है कि क्वेरी को उसी तरह से माना जाएगा जैसा वह है, एक अद्वितीय एडहॉक क्वेरी, और कंपाउंड क्वेरी प्लान का हिस्सा नहीं है। कभी-कभार चलने वाली किसी चीज के लिए, कोई बड़ी बात नहीं। किसी ऐसी चीज के लिए जिसे एक मिनट में सैकड़ों बार क्रियान्वित किया जाता है और जिसके पास बहुत से विशिष्ट वर्ग होते हैं, यह बहुत सारे नए, संभावित अनावश्यक, चक्र खाने वाली योजनाओं की योजना बनाती है, और योजना कैश के वैध समय को छोटा करती है।


Sybase ASE में एक उत्कृष्ट अनुप्रयोग उपयोग पिवोट होने के मूल्यों को जाने बिना पिवोट्स है। यह एक संग्रहीत खरीद में गतिशील SQL का उपयोग करके किया जा सकता है, लेकिन जहां तक ​​मुझे पता है कि Sybase ASE सिंटैक्स का समर्थन सीधे क्वेरी के रूप में करने के लिए नहीं करता है। केवल एक बार मान ज्ञात होने पर डेटा को पिवट करने के लिए क्वेरी लिखी जा सकती है।
रीचर्डक्रॉसली

-7

डायनेमिक SQL का उपयोग न करें।

99% समय डायनेमिक एसक्यूएल का उपयोग ज्ञान की कमी के कारण किया जाता है कि कैसे संग्रहीत प्रक्रियाओं में वैकल्पिक मापदंडों का उपयोग किया जाता है, बाकी 1% का उपयोग उस रिपोर्ट के लिए एक अत्यधिक जटिल क्वेरी बनाने के लिए किया जाता है जिसे ग्राहक समझ नहीं पाता है यहाँ तक की। डायनेमिक एसक्यूएल का अभिशाप और आशीर्वाद इस बात का उदाहरण नहीं है कि इसका उपयोग करना एक अच्छा विचार क्यों होगा, इसके बजाय सिर्फ यह सुझाव है कि यह समस्याग्रस्त है क्योंकि यह एसक्यूएल के सुरक्षा जोखिमों का उल्लेख नहीं करने, बनाए रखने की जटिलता को बढ़ाता है इंजेक्शन, खराब प्रदर्शन नहीं क्योंकि कैश लेकिन इसके साथ आने वाली बुरी प्रथाएं जैसे अस्थायी टेबल और कर्सर का उपयोग करना जो बेशक एक आलसी और भोले हैंप्रोग्रामर का दुरुपयोग होगा। प्रश्नों को लिखने के लचीलेपन जैसी कोई चीज नहीं है, एसक्यूएल एक घोषणात्मक भाषा है और इसे इस तरह से निपटा जाना चाहिए।

आलस्य ही सारी बुराई की जड़ है।

विरोधाभासी रूप से यह उत्तर सबसे अधोगामी में रैंक करने वाला है


लेख, वास्तव में, गतिशील एसक्यूएल के लिए एक आदर्श उपयोग के मामले का कम से कम एक उदाहरण पेश करता है और "प्रश्न लिखने के लिए लचीलापन जैसी कोई चीज नहीं है ..." यह सच नहीं है - गतिशील एसक्यूएल वास्तव में यही अनुमति देता है लचीलापन।
LowlyDBA

वैकल्पिक पैरामीटर? आप एंटीपैटर्न का
फॉरेस्ट

@LowlyDBA लेख कम से कम एक उदाहरण प्रस्तुत करता है: सबसे सरल चयन जो कभी देखा गया है, उस समस्या को हल करना कौन सी जटिल समस्या है? और लचीलेपन के लिए, हाँ, उन भोले प्रोग्रामर के लिए।
इवानजिन्हो

@ फॉरेस्ट आप इसे "एंटीपैटर्न" क्यों कहते हैं? क्योंकि आपके द्वारा प्रदान किया गया लिंक कभी ऐसा नहीं कहता है, और यह भी कभी नहीं दिखाता है कि एक डायनेमिक SQL में तर्क के दोबारा लिखे जाने के बाद कितना सुधार हुआ (जो कि इस मामले में अंततः उस क्वेरी को बनाए रखने के स्नोबॉल प्रभाव की तुलना में नगण्य होगा)
इवानोइन्हो

यह (खराब) राय आधारित उत्तर IMHO है। आपने अपने वर्णन में आने वाली समस्याओं के ठोस उदाहरण नहीं दिए हैं, और न ही आपने डायनेमिक एसक्यूएल का उपयोग करने के समर्थक को परिभाषित किया है
जॉर्ज.पलासियोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.