एसक्यूएल स्टोक्स बनाम कोड में एसक्यूएल रखने के लिए पेशेवरों और विपक्ष क्या हैं [बंद]


274

SQL को आपके C # सोर्स कोड में रखने या स्टोर्ड प्रोक्स के क्या फायदे / नुकसान हैं? मैं एक ओपन सोर्स प्रोजेक्ट पर एक मित्र के साथ इस पर चर्चा कर रहा हूं जो हम (C # ASP.NET फोरम) पर काम कर रहे हैं। फिलहाल, C # में SQL इनलाइन का निर्माण और SQL सर्वर DB को कॉल करके अधिकांश डेटाबेस एक्सेस किया जाता है। इसलिए मैं यह स्थापित करने की कोशिश कर रहा हूं कि इस विशेष परियोजना के लिए, सबसे अच्छा क्या होगा।

अब तक मेरे पास:

कोड में लाभ:

  • बनाए रखने में आसान - प्रश्नों को अद्यतन करने के लिए SQL स्क्रिप्ट चलाने की आवश्यकता नहीं है
  • दूसरे DB में पोर्ट करने में आसान - पोर्ट करने के लिए कोई प्रॉपर नहीं

संग्रहीत प्रोक्स के लिए लाभ:

  • प्रदर्शन
  • सुरक्षा

50
आप यह भी तर्क दे सकते हैं कि संग्रहीत प्रक्रियाएं रखरखाव को आसान बनाती हैं - आपको केवल एक क्वेरी को बदलने के लिए पूरे आवेदन को फिर से तैनात करने की आवश्यकता नहीं है।
डैरेन गोशबेल

27
@GvS: यह आपकी कंपनी की शिथिलता है, सर्वश्रेष्ठ अभ्यास नहीं। बेशक 1000 से 1 जगह चीजों को बदलना आसान है। डीबीए सिस्टम में कैवेलियर परिवर्तन को रोकने के लिए बस अपना हिस्सा कर रहे हैं, और इसका सम्मान किया जाना चाहिए।
जेरेमी होलोवेकस

जवाबों:


179

मैं संग्रहीत प्रक्रियाओं का प्रशंसक नहीं हूं

संग्रहीत कार्यविधियाँ अधिक बनाए रखने योग्य हैं क्योंकि: * जब भी आप कुछ SQL बदलना चाहते हैं तो आपको अपने C # ऐप को फिर से स्थापित करने की आवश्यकता नहीं है

जब भी डेटाटाइप्स बदलते हैं, या आप एक अतिरिक्त कॉलम, या जो भी वापस करना चाहते हैं, तब आप इसे फिर से शुरू करेंगे। जितनी बार आप अपने ऐप के नीचे से SQL को 'पारदर्शी रूप से' बदल सकते हैं, पूरे पर बहुत छोटा होता है

  • आप SQL कोड का पुन: उपयोग कर रहे हैं।

प्रोग्रामिंग भाषाओं, सी # शामिल है, इस अद्भुत बात है, एक समारोह कहा जाता है। इसका मतलब है कि आप एक ही कोड को कई स्थानों से प्राप्त कर सकते हैं! गजब का! फिर आप इनमें से किसी एक के अंदर पुनः प्रयोग करने योग्य SQL कोड डाल सकते हैं, या यदि आप वास्तव में उच्च तकनीक प्राप्त करना चाहते हैं, तो आप एक पुस्तकालय का उपयोग कर सकते हैं जो आपके लिए करता है। मेरा मानना ​​है कि वे ऑब्जेक्ट रिलेशनल मैपर कहलाते हैं, और इन दिनों बहुत आम हैं।

कोड पुनरावृत्ति सबसे खराब चीज है जो आप तब कर सकते हैं जब आप एक अनुरक्षण आवेदन बनाने की कोशिश कर रहे हों!

सहमत, यही वजह है कि स्टोरप्रोक्स एक बुरी चीज है। SQL के बजाए SQL में ... Refactor और decompose (छोटे भागों में टूटना) कोड को SQL के कार्यों में बहुत आसान है?

आपके पास 4 webservers और विंडोज़ ऐप्स का एक गुच्छा है जो समान SQL कोड का उपयोग करते हैं। अब आपको एहसास हुआ कि SQl कोड के साथ एक छोटी सी समस्या है इसलिए आप इसे करें ...... 1 स्थान पर खरीदारी बदलें या सभी को कोड पुश करें webservers, सभी विंडो बॉक्स पर सभी डेस्कटॉप ऐप्स (क्लिकोन की मदद कर सकते हैं) को फिर से इंस्टॉल करें

आपकी विंडोज़ ऐप्स सीधे केंद्रीय डेटाबेस से क्यों जुड़ रही हैं? यह एक बड़ा सुरक्षा छेद की तरह लगता है, और अड़चन है क्योंकि यह सर्वर-साइड कैशिंग को नियंत्रित करता है। क्या उन्हें वेब सेवा या आपके वेब सर्वर के समान कनेक्ट नहीं होना चाहिए?

तो, 1 नया स्पोक, या 4 नए वेबसर्वर पुश करें?

इस मामले में यह है एक नया sproc पुश करने के लिए आसान, लेकिन मेरे अनुभव में, 'धक्का दिया परिवर्तन' के 95% कोड और डेटाबेस प्रभावित करते हैं। यदि आप उस महीने के लिए वेबसर्वरों में 20 चीजें, और 1 डेटाबेस पर जोर दे रहे हैं, तो आप मुश्किल से बहुत कम खो देते हैं यदि आप 21 चीजों को वेबसर्वर और डेटाबेस के लिए शून्य पर धक्का देते हैं।

अधिक आसानी से कोड की समीक्षा की।

क्या आप बता सकते हैं कैसे? मुझे यह नहीं मिलता। विशेष रूप से स्प्रोक्स के रूप में देखना शायद स्रोत नियंत्रण में नहीं है, और इसलिए इसे वेब-आधारित एससीएम ब्राउज़रों और इसी तरह से एक्सेस नहीं किया जा सकता है।

अधिक विपक्ष:

Storedprocs डेटाबेस में रहती है, जो बाहरी दुनिया को एक ब्लैक बॉक्स के रूप में दिखाई देती है। साधारण चीजें जैसे उन्हें स्रोत नियंत्रण में रखना चाहते हैं एक बुरा सपना बन जाता है।

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


99

वर्तमान में कुछ अन्य थ्रेड्स पर इस पर चर्चा की जा रही है। मैं संग्रहीत प्रक्रियाओं का एक सुसंगत प्रस्तावक हूं, हालांकि Linq से Sql के लिए कुछ अच्छे तर्क प्रस्तुत किए जा रहे हैं।

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

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

[संपादित करें] यहां एक और वर्तमान चर्चा है


47

मेरी राय में आप इस प्रश्न पर हां या नहीं में वोट नहीं दे सकते। यह पूरी तरह से आपके एप्लिकेशन के डिज़ाइन पर निर्भर करता है।

मैं 3-स्तरीय वातावरण में SPs के उपयोग के खिलाफ पूरी तरह से वोट करता हूं, जहां आपके सामने एक एप्लिकेशन सर्वर है। इस तरह के वातावरण में आपका एप्लिकेशन सर्वर आपके व्यावसायिक तर्क को चलाने के लिए होता है। यदि आप एसपी का अतिरिक्त उपयोग करते हैं तो आप अपने सिस्टम पर अपने व्यापार तर्क के कार्यान्वयन को वितरित करना शुरू करते हैं और यह बहुत स्पष्ट हो जाएगा कि कौन जिम्मेदार है। आखिरकार आप एक एप्लिकेशन सर्वर के साथ समाप्त हो जाएंगे जो मूल रूप से निम्नलिखित के अलावा कुछ नहीं करेगा:

(Pseudocode)

Function createOrder(Order yourOrder) 
Begin
  Call SP_createOrder(yourOrder)
End

तो अंत में आप अपने मध्य स्तरीय इस बहुत ही शांत 4 सर्वर क्लस्टर पर चल रहा है उनमें से प्रत्येक 16 CPUs के साथ सुसज्जित है और यह वास्तव में कुछ भी नहीं होगा! कितना बेकार है!

यदि आपके पास एक मोटी gui क्लाइंट है जो सीधे आपके DB से जुड़ता है या शायद और भी अधिक अनुप्रयोगों के लिए यह एक अलग कहानी है। इस स्थिति में SPs किसी प्रकार के छद्म मध्य स्तरीय के रूप में कार्य कर सकते हैं जो डेटा मॉडल से आपके एप्लिकेशन को डिकॉउंड करता है और एक नियंत्रक एक्सेस प्रदान करता है।


44

कोड में लाभ:

  • बनाए रखने में आसान - प्रश्नों को अद्यतन करने के लिए SQL स्क्रिप्ट चलाने की आवश्यकता नहीं है
  • दूसरे DB में पोर्ट करने में आसान - पोर्ट करने के लिए कोई प्रॉपर नहीं

दरअसल, मुझे लगता है कि आपके पास वह पीछे है। IMHO, कोड में SQL बनाए रखने के लिए दर्द है क्योंकि:

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

संग्रहीत ऑब्जेक्ट को डेटाबेस ऑब्जेक्ट से कॉल करने के तरीकों के बारे में सोचें - उनका पुन: उपयोग करने के लिए बहुत आसान है, संपादित करने के लिए केवल एक ही स्थान है और इस घटना में कि आप DB प्रदाताओं को बदलते हैं, परिवर्तन आपके संग्रहीत प्रोक्स में होते हैं और आपके कोड में नहीं होते हैं ।

यह कहा, संग्रहीत procs का प्रदर्शन लाभ न्यूनतम है क्योंकि स्टु ने मुझसे पहले कहा था और आप एक संग्रहीत प्रक्रिया (अभी तक) में एक विराम बिंदु नहीं डाल सकते हैं।


33

CON

मुझे लगता है कि संग्रहीत कार्यविधियों के अंदर बहुत सारी प्रक्रियाएँ करने से आपका DB सर्वर अनम्यता का एक बिंदु बन जाएगा, जब यह आपके अधिनियम को बढ़ाने की बात आती है।

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

पेशेवरों

  1. जो इसके लायक हो सकता है उसके लिए प्रदर्शन (डीबी ड्राइवर / योजना मनोरंजन आदि द्वारा क्वेरी से बचने से)
  2. डेटा हेरफेर C / C ++ / C # कोड में एम्बेड नहीं किया गया है जिसका अर्थ है कि मेरे पास देखने के लिए कम स्तर का कोड है। एसक्यूएल कम क्रिया है और अलग से सूचीबद्ध होने पर देखने में आसान है।
  3. जुदाई के कारण लोग SQL कोड को खोजने और पुन: उपयोग करने में सक्षम होते हैं।
  4. स्कीमा बदलने पर इसकी चीजों को बदलना आसान है - आपको बस कोड को एक ही आउटपुट देना होगा और यह ठीक काम करेगा
  5. एक अलग डेटाबेस के लिए आसान बंदरगाह।
  6. मैं अपनी संग्रहीत प्रक्रियाओं पर व्यक्तिगत अनुमतियों को सूचीबद्ध कर सकता हूं और उस स्तर पर पहुंच को नियंत्रित कर सकता हूं।
  7. मैं अपने डेटा परिवर्तन कोड से अपने डेटा क्वेरी / दृढ़ता कोड को अलग कर सकता हूं।
  8. मैं अपनी संग्रहीत प्रक्रिया में परिवर्तनशील शर्तों को लागू कर सकता हूं और ग्राहक साइट पर अनुकूलित करना आसान होगा।
  9. मेरे स्कीमा और कथनों को एक साथ बदलने के लिए कुछ स्वचालित साधनों का उपयोग करना आसान हो जाता है जब यह मेरे कोड के अंदर एम्बेडेड होता है जहां मुझे नीचे शिकार करना होता है।
  10. डेटा एक्सेस के लिए सर्वोत्तम अभ्यास सुनिश्चित करना तब आसान होता है जब आपके पास एक फ़ाइल के अंदर आपका सभी डेटा एक्सेस कोड होता है - मैं ऐसे प्रश्नों की जांच कर सकता हूं जो गैर निष्पादित तालिका तक पहुँचते हैं या जो उच्च स्तर के क्रमांकन का उपयोग करते हैं या कोड में * का चयन करते हैं। ।
  11. स्कीमा परिवर्तन / डेटा हेरफेर लॉजिक परिवर्तन को खोजना आसान हो जाता है जब यह सभी एक फ़ाइल में सूचीबद्ध होता है।
  12. एसक्यूएल पर खोज और प्रतिस्थापन को संपादित करना आसान हो जाता है, जब वे एक ही स्थान पर होते हैं जैसे सभी संग्रहीत प्रोक्स के लिए लेन-देन अलगाव बयान जोड़ें / बदलें।
  13. जब डीबीए को मेरे एसक्यूएल सामान की समीक्षा करनी होती है, तो मैं और डीबीए लड़का पाता है कि एक अलग एसक्यूएल फाइल करना आसान / सुविधाजनक है।
  14. अंत में आपको एसक्यूएल इंजेक्शन के हमलों के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि आपकी टीम के कुछ आलसी सदस्य एम्बेडेड स्क्वैल्स का उपयोग करते समय पैरामीट्रिक प्रश्नों का उपयोग नहीं करते हैं।

22

संग्रहीत प्रक्रियाओं के लिए प्रदर्शन लाभ अक्सर लापरवाही से होता है।

संग्रहीत प्रक्रियाओं के लिए अधिक लाभ:

  • रिवर्स इंजीनियरिंग को रोकें (यदि एन्क्रिप्शन के साथ बनाया गया है, तो निश्चित रूप से)
  • डेटाबेस एक्सेस का बेहतर केंद्रीकरण
  • पारदर्शी तरीके से डेटा मॉडल को बदलने की क्षमता (नए ग्राहकों को तैनात किए बिना); विशेष रूप से काम अगर कई प्रोग्राम एक ही डेटा मॉडल का उपयोग करते हैं

16

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

मुझे डेटा मॉडल के साथ तंग युग्मन के साथ बहुत समस्या नहीं है क्योंकि मैं नहीं देखता कि उस युग्मन को वास्तव में तोड़ना कहां संभव है। एक एप्लिकेशन और उसका डेटा स्वाभाविक रूप से युग्मित हैं।


13

संग्रहित प्रक्रियाएं।

यदि कोई त्रुटि फिसल जाती है या तर्क थोड़ा बदल जाता है, तो आपको परियोजना को फिर से स्थापित करने की आवश्यकता नहीं है। इसके अलावा, यह विभिन्न स्रोतों से पहुंच की अनुमति देता है, न कि केवल एक जगह जिसे आपने अपने प्रोजेक्ट में क्वेरी को कोडित किया है।

मुझे नहीं लगता कि संग्रहीत प्रक्रियाओं को बनाए रखना कठिन है, आपको उन्हें सीधे डेटाबेस में नहीं, बल्कि पहले अलग-अलग फ़ाइलों में कोडित करना चाहिए, फिर आप उन्हें बस उस डीबी पर चला सकते हैं, जिसे आपको सेट-अप करने की आवश्यकता है।


24
यदि आप अपने कोड को फिर से जमा करने से बचने के लिए खुद को बुनियादी वास्तु निर्णय लेते हुए पाते हैं, तो कुछ भी करने से पहले, बिल्ड प्रक्रिया स्थापित करें जो पूरी तरह से चूसना नहीं करता है। यह एक गैर-तर्क है।
माइकल बोर्गवर्ड टीटी

13

संग्रहीत प्रक्रियाओं के लिए लाभ :

अधिक आसानी से कोड की समीक्षा की।

कम युग्मित, इसलिए अधिक आसानी से परीक्षण किया गया।

अधिक आसानी से देखते हैं।

नेटवर्क ट्रैफ़िक के दृष्टिकोण से प्रदर्शन आम तौर पर बेहतर होता है - यदि आपके पास कोई कर्सर है, या इसी तरह का है, तो डेटाबेस के लिए कई यात्राएं नहीं हैं

आप अधिक आसानी से डेटा तक पहुंच की रक्षा कर सकते हैं, तालिकाओं तक सीधी पहुंच को हटा सकते हैं, प्रोक्स के माध्यम से सुरक्षा लागू कर सकते हैं - यह आपको तालिका को अपडेट करने वाले किसी भी कोड को अपेक्षाकृत तेज़ी से ढूंढने की अनुमति देता है।

यदि अन्य सेवाएँ शामिल हैं (जैसे रिपोर्टिंग सेवाएँ), तो आपको अपने सभी लॉजिक को संग्रहीत कार्यविधि में संग्रहीत करने में आसानी हो सकती है, बजाय कोड में, और इसे डुप्लिकेट करने के

नुकसान:

डेवलपर्स के लिए प्रबंधन करने के लिए कठिन: स्क्रिप्ट का संस्करण नियंत्रण: क्या सभी का अपना डेटाबेस है, क्या संस्करण नियंत्रण प्रणाली डेटाबेस और आईडीई के साथ एकीकृत है?


हाँ, आपके पास दृश्य स्टूडियो 2012 डेटाबेस प्रोजेक्ट और tfs में संग्रहीत प्रक्रियाओं और डेटाबेस में एक संस्करण नियंत्रण हो सकता है।
हजीराज़ीन

11

कुछ परिस्थितियों में, कोड में गतिशील रूप से बनाया गया sql एक संग्रहीत खरीद की तुलना में बेहतर प्रदर्शन कर सकता है। यदि आपने एक संग्रहित खरीद बनाई है (मान लीजिए sp_customersearch) जो दर्जनों मापदंडों के साथ बेहद जटिल हो जाती है क्योंकि यह बहुत ही लचीली होनी चाहिए, तो आप शायद रनटाइम में कोड में बहुत ही सरल sql स्टेटमेंट उत्पन्न कर सकते हैं।

कोई यह तर्क दे सकता है कि यह बस SQL ​​से वेब सर्वर पर कुछ प्रसंस्करण को स्थानांतरित करता है, लेकिन सामान्य तौर पर यह एक अच्छी बात होगी।

इस तकनीक के बारे में दूसरी बड़ी बात यह है कि यदि आप SQL प्रोफाइलर में देख रहे हैं तो आप जिस क्वेरी को उत्पन्न करते हैं उसे देख सकते हैं और 20 मापदंडों के साथ संग्रहीत संग्रह कॉल को देखने की तुलना में इसे डीबग करना बहुत आसान है।


1
निश्चित नहीं है कि इस उत्तर को क्यों वोट दिया गया था .. यह सच है कि एक छोटी सी क्वेरी बेहतर प्रदर्शन कर सकती है। यह SQL सर्वर टीम द्वारा भी टिप्पणी की गई है।
ब्रैनोवेन

9

मुझे स्टोर किए गए प्रॉपर पसंद हैं, न जाने कितनी बार मैं एक संग्रहीत प्रक्रिया का उपयोग करके किसी एप्लिकेशन में बदलाव करने में सक्षम था जो एप्लिकेशन को किसी भी डाउनटाइम का उत्पादन नहीं करता था।

Transact SQL का बड़ा प्रशंसक, बड़े प्रश्नों को ट्यून करना मेरे लिए बहुत उपयोगी साबित हुआ है। लगभग 6 वर्षों में किसी भी इनलाइन SQL को नहीं लिखा है!


मैं कोड में querries का उपयोग करते हुए एक और बात नहीं समझ सकता, बस समझ नहीं सकता ...
Chaki_Black

8

आप स्पार्क्स के लिए 2 समर्थक अंक सूचीबद्ध करते हैं:

प्रदर्शन - वास्तव में नहीं। Sql 2000 या अधिक में क्वेरी प्लान ऑप्टिमाइज़ेशन बहुत अच्छा है, और कैश किया गया है। मुझे यकीन है कि ओरेकल आदि इसी तरह की चीजें करते हैं। मुझे नहीं लगता कि किसी भी प्रदर्शन के लिए स्प्रोक्स का मामला है।

सुरक्षा? स्पोक्स अधिक सुरक्षित क्यों होगा? जब तक आप एक बहुत असुरक्षित डेटाबेस है वैसे भी सभी का उपयोग आपके DBA से या आपके आवेदन के माध्यम से होने जा रहा है। हमेशा सभी प्रश्नों का उत्तर दें - कभी भी उपयोगकर्ता इनपुट से कुछ इनलाइन न करें और आप ठीक रहेंगे।

वैसे भी प्रदर्शन के लिए यह सबसे अच्छा अभ्यास है।

Linq निश्चित रूप से जिस तरह से मैं एक नई परियोजना पर अभी जाना होगा। इसी तरह की पोस्ट देखें ।


Ad-hoc SQL निष्पादन योजनाएं केवल विशिष्ट परिस्थितियों में पुन: उपयोग की जाती हैं: tinyurl.com/6x5lmd [कोड प्रमाण के साथ SO उत्तर] LINQ to SQL आधिकारिक तौर पर मृत है: smallurl.com/6298nd [ब्लॉग पोस्ट]
HTTP 410

1
Procs जाने का सबसे सुरक्षित तरीका है। वे उपयोगकर्ता को केवल प्रोक्स में कार्रवाई करने से सीमित करते हैं। वे सीधे एक मेज पर नहीं जा सकते हैं या देख सकते हैं कि उनके पास चीजों को लिखने और बदलने के लिए पहुंच है। आंतरिक खतरों से नुकसान को रोकने के लिए प्रोटीन आवश्यक हैं।
HLGEM

8

@Keith

सुरक्षा? स्पोक्स अधिक सुरक्षित क्यों होगा?

जैसा कि Komradekatz द्वारा सुझाया गया है, आप तालिकाओं (उपयोगकर्ता नाम / पासवर्ड कॉम्बो के लिए जो डीबी से जुड़ता है) के लिए उपयोग को अस्वीकार कर सकते हैं और एसपी को केवल एक्सेस की अनुमति दे सकते हैं। इस तरह अगर किसी को आपके डेटाबेस में उपयोगकर्ता नाम और पासवर्ड मिलता है, तो वे SP को निष्पादित कर सकते हैं, लेकिन सारणी या DB के किसी अन्य भाग तक नहीं पहुंच सकते हैं।

(बेशक स्प्रोक्स को निष्पादित करना उन्हें उन सभी डेटा दे सकता है जिनकी उन्हें ज़रूरत है लेकिन यह उन स्प्रोक्स पर निर्भर करेगा जो उपलब्ध थे। उन्हें तालिकाओं तक पहुंच प्रदान करना उन्हें सब कुछ एक्सेस करने की अनुमति देता है।)


1
@ जो फिलिप्स, विचार आपको प्रोक्स को बेहतर या समान सुरक्षा नहीं देते हैं और वे धोखाधड़ी या आंतरिक नुकसान को रोकने में उपयोगी नहीं होंगे। जब आप procs का उपयोग करते हैं तो स्केयरिटी मॉडल यह होता है कि वे उपयोगकर्ताओं को केवल टेबल या व्यूज़ तक नहीं पहुंचते हैं और इस प्रकार वे कुछ भी नहीं कर सकते हैं सिवाय इसके कि कोई प्रोक क्या करता है। यदि आपके पास वित्तीय डेटा है और आप प्रॉक्सेस का उपयोग नहीं कर रहे हैं, तो आपका सिस्टम जोखिम में है।
HLGEM

7

इस पर इस तरीके से विचार करें

आपके पास 4 webservers और विंडोज़ ऐप्स का एक गुच्छा है जो समान SQL कोड का उपयोग करते हैं। अब आपको एहसास हुआ कि SQl कोड के साथ एक छोटी सी समस्या है इसलिए आप इसे करें ...... 1 स्थान पर खरीदारी बदलें या सभी को कोड पुश करें webservers, सभी विंडो बॉक्स पर सभी डेस्कटॉप ऐप्स (क्लिकोन की मदद कर सकते हैं) को फिर से इंस्टॉल करें

मैं संग्रहीत procs पसंद करते हैं

किसी प्रॉडक्ट के खिलाफ परफॉर्मेंस टेस्टिंग करना भी आसान है, इसे क्वेरी एनालाइजर सेट स्टैटिस्टिक्स में लगा दें io / time on show showplan_text on और voila

क्या कहा जा रहा है यह देखने के लिए प्रोफाइलर को चलाने की आवश्यकता नहीं है

सिर्फ मेरे 2 सेंट


6

मैं उन्हें कोड में रखना पसंद करता हूं (ORM का उपयोग करते हुए, इनलाइन या तदर्थ का उपयोग नहीं करता) इसलिए वे स्रोत नियंत्रण द्वारा कवर किए जाते हैं।

इसके अलावा, संग्रहीत कार्यविधियाँ स्वाभाविक रूप से अधिक सुरक्षित नहीं हैं। आप एक स्पोक के साथ एक बुरी क्वेरी को इनलाइन के रूप में आसानी से लिख सकते हैं। एक पैरामीटर के रूप में पैरामीटर इनलाइन क्वेरीज़ सुरक्षित हो सकते हैं।


6

अपने एप्लिकेशन कोड का उपयोग करें क्योंकि यह सबसे अच्छा करता है: तर्क संभालें।
उपयोगकर्ता अपने डेटाबेस के लिए यह सबसे अच्छा करता है: डेटा संग्रहीत करें।

आप संग्रहीत कार्यविधियों को डीबग कर सकते हैं, लेकिन आपको कोड में डीबग करना और मेनटेन करने में आसानी होगी। आमतौर पर आप हर बार जब आप डेटाबेस मॉडल बदलते हैं, तो आप अपने कोड को फिर से जमा करेंगे।

वैकल्पिक खोज मापदंडों के साथ संग्रहीत कार्यविधियाँ भी बहुत अक्षम हैं क्योंकि आपको पहले से ही सभी संभावित मापदंडों को निर्दिष्ट करना होगा और जटिल खोज कभी-कभी संभव नहीं होती है क्योंकि आप अनुमान लगा सकते हैं कि खोजबीन में पैरामीटर कितनी बार दोहराया जा रहा है।


2
जब कई ऐप्स समान डेटाबेस से टकराते हैं, और डेटाबेस आयात और अन्य प्रत्यक्ष पहुंच (10% तक सभी कीमतों को अपडेट करते हैं) से प्रभावित होते हैं, तो तर्क डेटाबेस में होना चाहिए या आप डेटाबेस अखंडता खो देंगे।
HLGEM

कई ऐप्स के मामले में, लॉजिक को एक लाइब्रेरी में रखने के लिए, जो सभी ऐप द्वारा उपयोग की जाती है, ऐप भाषा में लॉजिक को बनाए रखते हुए अखंडता को बनाए रखने की अनुमति देता है। आयात / प्रत्यक्ष पहुंच के लिए, यह आमतौर पर स्थितिजन्य है कि क्या नियम जो ऐप्स पर लागू होते हैं, उन्हें लागू किया जाना चाहिए या नहीं।
डेव शेरोमैन

3
कई ऐप्स को डेटाबेस में एक ही प्रकार के परिवर्तन नहीं करने चाहिए। एक ही ऐप कंपोनेंट होना चाहिए जो एक ही प्रकार के परिवर्तनों से संबंधित हो। तब उस ऐप को एक सेवा को उजागर करना चाहिए यदि अन्य लोग रुचि रखते हैं। एक ही डेटाबेस / टेबल को बदलते हुए कई ऐप जो भी वे फिट देखते हैं, वह ऐप की एक प्रणाली और डेटाबेस को अस्वीकार्य होने का कारण बनता है।
जिहो हान

2
"पीएल / एसक्यूएल में कहा गया है कि एक ही ऐप कंपोनेंट होना चाहिए, जो एक ही प्रकार के परिवर्तनों से संबंधित हो।"
रसेल हेल

6

जब सुरक्षा की बात आती है, तो संग्रहीत प्रक्रियाएं अधिक सुरक्षित होती हैं। कुछ ने तर्क दिया है कि सभी पहुंच वैसे भी एप्लिकेशन के माध्यम से होगी। जिस चीज को बहुत से लोग भूल रहे हैं, वह यह है कि ज्यादातर सुरक्षा उल्लंघनों एक कंपनी के अंदर से आते हैं। इस बारे में सोचें कि कितने डेवलपर्स आपके एप्लिकेशन के लिए "छिपा हुआ" उपयोगकर्ता नाम और पासवर्ड जानते हैं?

इसके अलावा, जैसा कि MatthieuF ने बताया है, एप्लिकेशन (चाहे वह डेस्कटॉप या वेब सर्वर पर हो) और डेटाबेस सर्वर के बीच कम दौर की यात्राओं के कारण प्रदर्शन में बहुत सुधार हो सकता है।

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

मैं एसक्यूएल प्रोग्रामिंग को उन लोगों के हाथों में रखने के लिए प्लस कॉलम में भी जांच डालूंगा, और एसपी के लिए कोड को अलग और परीक्षण / ऑप्टिमाइज़ करना बहुत आसान बनाता है।

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


जब मॉडल बदलता है, तो आमतौर पर कोड को बदलने की आवश्यकता होती है, चाहे वह किसी स्प्रोक्स या गतिशील एसक्यूएल का उपयोग कर रहा हो। और एक बार जब आप टेबल / स्कीमा बनाते हैं तो आप कितनी बार सिर्फ टेबल / स्कीमा बदलते हैं? प्रायः नहीं। आमतौर पर व्यवसाय से बदलाव आते हैं जहां उन्हें एक और कॉलम या दूसरी तालिका जोड़ने की आवश्यकता होती है, इस स्थिति में, मुझे संदेह है कि आप एक कोड परिवर्तन के बिना कर सकते हैं।
जिहो हान

4

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


डेटा सुरक्षा महत्वपूर्ण है जब आप व्यक्तिगत जानकारी या विशेष रूप से वित्तीय सुधार के साथ देरी कर रहे हैं। ज्यादातर धोखाधड़ी अंदरूनी लोगों द्वारा की जाती है। आप उन्हें आंतरिक नियंत्रण को बायपास करने के लिए आवश्यक पहुँच देना नहीं चाहते हैं।
HLGEM

4

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


4

मैं संग्रहीत procs के पक्ष में यह मान रहा हूं कि आप धोखा नहीं देते हैं और संग्रहीत खरीद में गतिशील SQL का उपयोग करते हैं। सबसे पहले, संग्रहीत प्रॉक्स का उपयोग करने से डीबीए को संग्रहीत खरीद स्तर पर अनुमतियाँ सेट करने की अनुमति मिलती है, न कि टेबल स्तर पर। यह न केवल एसक्यूएल इंजेक्शन अटैक से निपटने के लिए महत्वपूर्ण है, बल्कि डेटाबेस को सीधे एक्सेस करने और चीजों को बदलने से अंदरूनी सूत्रों को रोकने के लिए है। यह धोखाधड़ी को रोकने में मदद करने का एक तरीका है। कोई डेटाबेस जिसमें व्यक्तिगत जानकारी (SSN, क्रेडिट कार्ड नंबर, आदि) शामिल हैं या जो किसी भी तरह से वित्तीय लेनदेन बनाता है, को कभी भी सख्त प्रक्रियाओं के अलावा एक्सेस नहीं किया जाना चाहिए। यदि आप किसी अन्य विधि का उपयोग करते हैं जो आप अपने डेटाबेस को कंपनी में व्यक्तियों के लिए खुला छोड़ रहे हैं ताकि नकली वित्तीय लेनदेन बना सकें या डेटा चोरी कर सकें जिसका उपयोग पहचान की चोरी के लिए किया जा सकता है।

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


4

हम ओरेकल डीबी के साथ संग्रहीत प्रक्रियाओं का उपयोग करते हैं जहां मैं अब काम करता हूं। हम तोड़फोड़ का भी उपयोग करते हैं। सभी संग्रहीत कार्यविधियाँ .pkb और .pks फ़ाइलों के रूप में बनाई जाती हैं और सबवर्सन में सहेजी जाती हैं। मैंने पहले इन-लाइन एसक्यूएल किया है और यह एक दर्द है! मैं जिस तरह से हम इसे यहाँ पसंद करते हैं। नई संग्रहीत कार्यविधियाँ बनाना और उनका परीक्षण करना आपके कोड में करने से बहुत आसान है।

वहां एक


3

छोटे लॉग

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


3

मैं संग्रहीत प्रक्रियाओं का बहुत बड़ा प्रशंसक नहीं हूं, लेकिन मैं उन्हें एक शर्त में उपयोग करता हूं:

जब क्वेरी बहुत बड़ी होती है, तो इसे कोड से भेजने के बजाय डेटाबेस में संग्रहीत प्रक्रिया के रूप में संग्रहीत करना बेहतर होता है। इस तरह, अनुप्रयोग सर्वर से डेटाबेस में स्ट्रिंग वर्णों की बड़ी मात्रा भेजने के बजाय, केवल "EXEC SPNAME"आदेश भेजा जाएगा।

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

लेकिन आदमी, वे प्रबंधन करने के लिए बहुत भयानक हैं। मैं उनसे उतना ही बचता हूं जितना मैं कर सकता हूं।


3

SQL संग्रहीत संग्रह क्वेरी के प्रदर्शन को नहीं बढ़ाता है


यह कैसे नहीं हो सकता है? कृपया इस बारे में बताएं।
संध्या

यदि SQL क्वेरी संकलित की जा सकती है तो यह प्रदर्शन को बढ़ाएगा।
टीटी।

3

स्पष्ट रूप से संग्रहीत प्रक्रियाओं का उपयोग करने से कोड में एसक्यूएल के निर्माण पर कई फायदे हैं।

  1. आपका कोड कार्यान्वयन और SQL एक दूसरे से स्वतंत्र हो जाते हैं।
  2. कोड को पढ़ना आसान है।
  3. एक बार लिखने के बाद कई बार उपयोग करें।
  4. एक बार संशोधित करें
  5. डेटाबेस के बारे में प्रोग्रामर को आंतरिक विवरण देने की आवश्यकता नहीं है। आदि आदि।

मैं कभी भी ऐसी स्थिति में नहीं रहा हूँ जहाँ एक कोड समस्या या नई सुविधा के बारे में कम जानकारी होना मेरे लिए लाभकारी रहा हो, क्या आप संख्या 5 को स्पष्ट कर सकते हैं?
OpenCoderX

2

संग्रहीत कार्यविधियाँ अधिक बनाए रखने योग्य हैं क्योंकि:

  • जब भी आप कुछ एसक्यूएल को बदलना चाहते हैं, तो आपको अपने सी # ऐप को दोबारा नहीं बनाना होगा
  • आप SQL कोड का पुन: उपयोग कर रहे हैं।

कोड पुनरावृत्ति सबसे खराब चीज है जिसे आप तब कर सकते हैं जब आप एक अनुरक्षण आवेदन बनाने की कोशिश कर रहे हों!

क्या होता है जब आप एक तर्क त्रुटि पाते हैं जिसे कई स्थानों पर ठीक करने की आवश्यकता होती है? आप उस अंतिम स्थान को बदलने के लिए भूल जाते हैं जहां आप अपने कोड को कॉपी और पेस्ट करते हैं।

मेरी राय में, प्रदर्शन और सुरक्षा लाभ एक अतिरिक्त हैं। आप अभी भी असुरक्षित / अक्षम SQL संग्रहीत कार्यविधियाँ लिख सकते हैं।

दूसरे DB में पोर्ट करने में आसान - पोर्ट करने के लिए कोई प्रॉपर नहीं

एक और डीबी में निर्माण के लिए अपने सभी संग्रहीत प्रक्रियाओं को स्क्रिप्ट करना बहुत मुश्किल नहीं है। वास्तव में - यह आपकी तालिकाओं को निर्यात करने से आसान है क्योंकि चिंता करने के लिए कोई प्राथमिक / विदेशी कुंजी नहीं है।


बस एक नोट: "एक और डीबी के लिए पोर्ट करने में आसान - पोर्ट के लिए कोई प्रॉपर नहीं" केवल दूसरे इंस्टॉलेशन के लिए दूसरे डीबीएमएस में पोर्ट करने के लिए भेजा जाता है । वहाँ विकल्प बाहर हैं, तुम्हें पता है ;-)।
साल्के

2

@ टेरैपिन - स्प्रोक्स इंजेक्शन के हमलों की तरह ही कमजोर हैं। जैसा मैंने कहा:

हमेशा सभी प्रश्नों का उत्तर दें - कभी भी उपयोगकर्ता इनपुट से कुछ इनलाइन न करें और आप ठीक रहेंगे।

यह स्पार्क्स और गतिशील Sql के लिए जाता है।

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


@ जीयू - हाँ आप सही हैं, स्प्रोक्स आपको एप्लिकेशन उपयोगकर्ताओं को नियंत्रित करने देते हैं ताकि वे केवल स्पोक प्रदर्शन कर सकें, अंतर्निहित कार्रवाई नहीं।

मेरा प्रश्न यह होगा: यदि सभी अपने ऐप के माध्यम से इसे एक्सेस करते हैं, तो अपडेट / डालने आदि के लिए सीमित अधिकारों के साथ कनेक्शन और उपयोगकर्ताओं का उपयोग करके, क्या यह अतिरिक्त स्तर सुरक्षा या अतिरिक्त प्रशासन को जोड़ता है?

मेरी राय बहुत बाद की है। यदि उन्होंने आपके आवेदन से उस बिंदु पर समझौता कर लिया है जहां वे इसे फिर से लिख सकते हैं तो उनके पास बहुत सारे अन्य हमले हैं जो वे उपयोग कर सकते हैं।

Sql इंजेक्शन अभी भी उन स्पोक्स के खिलाफ किया जा सकता है यदि वे गतिशील रूप से इनलाइन कोड करते हैं, तो स्वर्ण नियम अभी भी लागू होता है, सभी उपयोगकर्ता इनपुट को हमेशा पैराट्राइज्ड होना चाहिए।


यह आपके द्वारा लड़ने के लिए जरूरी नहीं है। आप उन उपयोगकर्ताओं के लिए तालिकाओं तक सीधी पहुंच की अनुमति नहीं दे सकते जो धोखाधड़ी करने के लिए डेटा को बदल सकते हैं।
HLGEM

एक नीति के रूप में, संग्रहीत प्रॉक्सेस को गतिशील एसक्यूएल का उपयोग करने की अनुमति नहीं दी जानी चाहिए, यदि आप इसे देखते हैं तो लगभग हमेशा एक गैर-गतिशील समाधान होता है।
HLGEM

एसक्यूएल इंजेक्शन डायनामिक-इनलाइन कोड के साथ स्पार्क्स के खिलाफ इतना प्रभावी नहीं है क्योंकि डायनेमिक कोड कॉलर अनुमति के साथ निष्पादित होता है, न कि मालिक अनुमति (स्टैटिक कोड के विपरीत)। यह SQL सर्वर के लिए सही है - Oracle के बारे में निश्चित नहीं है।
HTTP 410

2

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

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

इसलिए, उन संग्रहीत प्रक्रियाओं से चिपके रहें, जो व्यावसायिक तर्क रखने वाले लोगों के बजाय केवल संबंधपरक विवरण को दूर करते हैं।


"संग्रहीत कार्यविधियाँ (पीएल / एसक्यूएल एक कुख्यात उदाहरण है) लिखने के लिए इस्तेमाल की जाने वाली भाषाएं बहुत क्रूर हैं [और] आज की लोकप्रिय भाषाओं में आपको जो भी उपनाम दिखाई देंगे, उन्हें पेश न करें।" आपको पीएल / एसक्यूएल डॉक्स ( download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/toc.htm ) को फिर से पढ़ना होगा । PL / SQL में संकुल का उपयोग करते हुए एनकैप्सुलेशन है, ऑब्जेक्ट प्रकारों के माध्यम से OOP, अपवाद हैंडलिंग, कोड के डायनामिक निष्पादन, डीबगर्स, प्रोफाइलर, आदि, साथ ही सैकड़ों मानक, Oracle- सप्लाई किए गए पैकेज / लाइब्रेरी जो HTTP कॉल से एन्क्रिप्शन और रेग्युलर एक्सप्रेशन के लिए सब कुछ करने के लिए हैं। । PL / SQL में बहुत सारे निकोटी हैं।
ObiWanKenobi 22

2

मैं आमतौर पर OO कोड लिखता हूं। मुझे संदेह है कि आप में से अधिकांश शायद करते हैं। उस संदर्भ में, मुझे यह स्पष्ट प्रतीत होता है कि SQL तर्क सहित - सभी व्यावसायिक तर्क - वर्ग की परिभाषाओं में हैं। तर्क को विभाजित करना, जैसे कि इसका हिस्सा ऑब्जेक्ट मॉडल में रहता है और डेटाबेस में भाग उपयोगकर्ता इंटरफ़ेस में व्यावसायिक तर्क रखने से बेहतर नहीं है।

संग्रहित procs के सुरक्षा लाभों के बारे में पहले के उत्तर में बहुत कुछ कहा गया है। ये दो व्यापक श्रेणियों में आते हैं:

1) डेटा तक सीधी पहुंच को प्रतिबंधित करना। यह निश्चित रूप से कुछ मामलों में महत्वपूर्ण है और, जब आप किसी से मुठभेड़ करते हैं, तो संग्रहीत प्रोक्स आपके एकमात्र विकल्प से बहुत अधिक होते हैं। मेरे अनुभव में, ऐसे मामले नियम के बजाय अपवाद हैं, हालांकि।

2) SQL इंजेक्शन / पैराड्राइज्ड क्वेश्चन। यह आपत्ति एक लाल हेरिंग है। इनलाइन एसक्यूएल - यहां तक ​​कि गतिशील रूप से उत्पन्न इनलाइन एसक्यूएल - किसी भी संग्रहीत खरीद के रूप में पूरी तरह से पैराट्राइज्ड हो सकता है और इसे अपने नमक के लायक किसी भी आधुनिक भाषा में आसानी से किया जा सकता है। यहाँ कोई फायदा नहीं है। ("आलसी डेवलपर्स मापदंडों का उपयोग करने से परेशान नहीं हो सकते हैं" एक वैध आपत्ति नहीं है। यदि आपके पास आपकी टीम के डेवलपर्स हैं जो मापदंडों का उपयोग करने के बजाय अपने SQL में उपयोगकर्ता डेटा को केवल संक्षिप्त करना पसंद करते हैं, तो आप पहले उन्हें शिक्षित करने की कोशिश करते हैं, फिर आप उन्हें आग लगाते हैं। यदि वह काम नहीं करता है, तो जैसे आप उन डेवलपर्स के साथ करेंगे जिनके पास कोई अन्य बुरा, राक्षसी हानिकारक आदत है।)


2

मैं SPROC के ऊपर कोड का बहुत बड़ा समर्थक हूं। नंबर एक कारण कोड को कसकर जोड़े रख रहा है, फिर एक करीबी दूसरा कस्टम उपयोगिताओं के बिना इसे नियंत्रित करने के लिए स्रोत नियंत्रण में आसानी है।

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

यह हमारे कोड और हमारे sql कॉल को एक ही संस्करण नियंत्रण में संग्रहीत करता है, बिना अपडेट के लिए कुछ बाहरी एप्लिकेशन चलाने के लिए "भूल"।


जब आप "भूल" के बारे में तालिकाओं में परिवर्तन दोहराने के बारे में क्या?
क्रेग्मोलिवर

प्रक्रिया परिनियोजन समस्याओं को हल कर सकती है।
टॉम एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.