क्या बाद में किसी बुरे विचार को अंजाम देने के लिए एक तालिका में SQL स्टेटमेंट को सहेजना है?


21

एक खराब विचार को निष्पादित करने के लिए एक MySQL तालिका में SQL स्टेटमेंट सहेज रहा है? एसक्यूएल स्टेटमेंट निष्पादन के लिए तैयार होगा, यानी स्वैप या कुछ भी करने के लिए कोई पैरामीटर नहीं होगा, उदाहरण के लिए DELETE FROM users WHERE id=1

मुझे लगता है कि मैं आलसी हो रहा हूं, लेकिन मैंने इस विचार के बारे में सोचा क्योंकि मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसके लिए समय-समय पर SQL कथनों को निष्पादित करने वाले काफी क्रोन नौकरियों की आवश्यकता होगी।


यदि आप इन SQL कथनों को एक बार चलाने का इरादा रखते हैं, या यदि आप एक ही बार बार एक ही कथन को चलाना चाहते हैं तो आपको स्पष्ट करना चाहिए।
ग्रैंडमास्टरबी

10
यह पूरा प्रश्न उन स्थितियों में से एक जैसा लगता है, जहां मूल दृष्टिकोण गलत है। लेकिन यह बताना मुश्किल है कि समस्या के बारे में हम बहुत कम जानते हैं।
एलिक रॉबर्टसन

जवाबों:


46

यदि आप पूछ रहे हैं तो यह सुरक्षित है। जब तक आप अपनी सुरक्षा को लेकर सावधान रहते हैं, जब तक आप अपने डेटा की सुरक्षा के साथ हैं।

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

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

अन्य डेटाबेस में अच्छे कारण के लिए ये समतुल्य हैं। आप इस कार्यक्षमता की आवश्यकता वाले पहले व्यक्ति नहीं हैं।


1
अनुसूचक का उपयोग करने पर +1। शेड्यूलर की पहुंच को सिर्फ प्रोक्स तक सीमित करना टेबल एक्सेस से बेहतर है।
जेफ़ओ

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

32

यदि आप SQL स्टेटमेंट को बाद के निष्पादन के लिए डेटाबेस में सहेजना चाहते हैं, तो उन्हें तालिका में रखने से बेहतर विकल्प है: इस विशिष्ट उद्देश्य के लिए प्रदान की गई कार्यक्षमता का उपयोग करें। उन्हें संग्रहीत प्रक्रियाओं में रखें।


2
तो क्रोन जॉब चलाने के लिए संग्रहीत प्रक्रियाओं की सूची को कहाँ रखता है?
जेएफओ

1
यह उपयोगी stackoverflow.com/questions/6560639/… हो सकता है, हालांकि यह क्रॉन का उपयोग नहीं कर रहा है
MetaFight

पता नहीं मैं क्या सोच रहा था। प्रॉक्स की एक सूची सभी को एक ही खरीद से निष्पादित की जा सकती है, इसलिए क्रॉन जॉब को केवल एक को निष्पादित करने की आवश्यकता है।
जेएफओ

11

नहीं, मैं कहूंगा कि यह अच्छा विचार नहीं है।

इसका अर्थ है कि प्रत्येक "वास्तविक" क्वेरी / अपडेट को डेटाबेस पर 2 हिट्स की आवश्यकता होगी - एक "वास्तविक" क्वेरी / अपडेट प्राप्त करने के लिए, और एक इसे निष्पादित करने के लिए।

यह एक छोटी प्रणाली में एक बड़ा मुद्दा नहीं हो सकता है, लेकिन आपके सिस्टम को जितना अधिक उपयोगकर्ता / लेन-देन होगा, उतना कम होगा।

मुझे लगता है कि यह आपके कोड में SQL एम्बेडिंग के लिए एक विकल्प की तलाश से आता है?

मेसन व्हीलर के रूप में एक संग्रहीत कार्यविधि में SQL को एनकैप्सुलेट करना जैसा कि सुझाव दिया गया है, एक तरीका होगा जो इस विचार से बहुत बेहतर होगा।


+1, यह मुख्य कारण है कि @ मेसन व्हीलर का समाधान सही है - वह सिर्फ उस पर प्रकाश डालने से चूक गया। यद्यपि IMHO इसका प्रदर्शन नहीं है, जिसे मैं यहाँ सबसे महत्वपूर्ण देख रहा हूँ - DB से SQL स्टेटमेंट निकालकर और फिर उसे एक्ससेन्स के लिए वापस भेजने की ज़रूरत नहीं है।
डॉक्टर ब्राउन

Sql स्टेटमेंट की सूची को एक ही डेटाबेस / सर्वर आदि में क्यों स्टोर करना पड़ता है?
जेफ़ओ

1
ओपी डेटाबेस पर 2 हिट का प्रस्ताव देने वाला एक है। मैं कहता हूं कि उसे ऐसा नहीं करना चाहिए। आप तब पूछते हैं कि क्यों एक ही डेटाबेस / सर्वर होना चाहिए। मैं पूछता हूं कि यह किसने कहा? फिर आप पूछते हैं कि आपको DB पर 2 हिट कैसे मिलेंगी। जो कुछ भी आप कर रहे हैं, उसके बजाय आप अपने वास्तविक प्रश्न को क्यों नहीं बताते हैं?
ओज

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

1
@ ओज़: आप अपने उत्तर के प्रदर्शन पहलू को बहुत अधिक महत्व देते हैं - अधिकांश वास्तविक दुनिया के परिदृश्यों में प्रदर्शन संभवतः सबसे अधिक उपेक्षित होता है। लेकिन दो क्रियाओं की आवश्यकता (पहले "वास्तविक" क्वेरी / अपडेट प्राप्त करने के लिए, दूसरा इसे निष्पादित करने के लिए) चीजों को आवश्यक से अधिक जटिल बनाता है।
डॉक ब्राउन

4

क्षमा करें, मुझे नहीं लगता कि यह एक अच्छा विचार है।

उस मामले पर विचार करें जहां प्रश्न में तालिका बदलती है। मान लें कि आपका आईडी कॉलम नए_ id में बदल गया है ।

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

जैसे मैंने वर्णन किया है, मैं आमतौर पर स्टैंडअलोन SQL फ़ाइलों, संग्रहीत कार्यविधियों, ट्रिगर्स, इन-लाइन SQL को क्लाइंट कोड (VB, C #, C ++ आदि) पर देखूंगा, लेकिन अंतिम स्थान मैं देखना चाहता हूं। डेटाबेस तालिकाओं में है। हालाँकि शायद अब मैं करूँगा! :)


2

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

आपके द्वारा वर्णित के लिए - "... एक परियोजना जिसके लिए काफी कुछ क्रॉन नौकरियों की आवश्यकता होगी जो समय-समय पर SQL कथनों को निष्पादित करेंगे" - अन्य उत्तर संभवतः यह सुझाव देने में सही हैं कि आपने स्टोर प्रक्रियाओं का उपयोग किया था, या समकक्ष, डीबीएमएस के लिए ' फिर से उपयोग करना

यह तय करने के लिए एक अच्छा मानदंड कि क्या SQL को किसी तालिका में संग्रहीत संग्रहीत कार्यविधि में समझाना संभव है, यह निर्धारित कर रहा है कि उस SQL ​​को कौन बनाए रखेगा। यदि उपयोगकर्ता उस SQL ​​को बनाए रखते हैं, अर्थात वे इसे लिखते हैं और जब चाहें तब इसे बदल देते हैं, तो यह उस SQL ​​को किसी तालिका में संग्रहीत करने के लिए पूरी तरह से ठीक है, और वास्तव में सबसे अच्छा हो सकता है। यदि डेवलपर्स उस एसक्यूएल को बनाए रख रहे हैं, तो इसे एक ऐसे फॉर्म में संग्रहित किया जाना चाहिए, जो आपके (उम्मीद के मुताबिक स्वचालित) बिल्ड और परिनियोजन प्रक्रियाओं द्वारा अपडेट किया जा सकता है, उदाहरण के लिए डेटाबेस में संग्रहीत प्रक्रिया की तरह एक ऑब्जेक्ट के रूप में संग्रहीत किया जाता है।


1
जवाब के लिए धन्यवाद। मैंने क्वेरीज़ को चलाने के लिए MySQL ईवेंट्स का उपयोग करके समाप्त किया। काफी लोगों ने सोचा कि "मौलिक दृष्टिकोण गलत है" :) जब मुझे ज़रूरत थी तो एक विशिष्ट डेटा एक्शन से 15 मिनट के बाद कुछ एसक्यूएल स्टेटमेंट चलाना था।
एंबेडेड रूस्तम

2
@AmgadSuliman - यह विशेष रूप से एसई साइटों पर सभी के लिए धर्मार्थ होना महत्वपूर्ण है। मज़बूत राय रखना अच्छा है, लेकिन उन पैटर्नों के लिए ओवर-मैच करना बहुत आसान है, जिनके विरुद्ध हम आनंद लेते हैं। लेकिन इन साइटों पर दूसरों के लिए धर्मार्थ होने का हिस्सा पर्याप्त संदर्भ प्रदान कर रहा है; बहुत अधिक वास्तविक प्रश्न को अस्पष्ट कर सकता है, लेकिन आम तौर पर बाद के संपादन द्वारा इसे ठीक करना काफी आसान है।
केनी एविट

1

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

बेशक, आप उन्हें डेटाबेस स्तर पर रख सकते हैं (या तो एक तालिका में या, बेहतर अभी तक, संग्रहीत प्रक्रियाओं के रूप में), हालांकि यदि आप मेरे जैसे ही आलसी हैं; तो; लेकिन प्रदर्शन, एनी फ़ाइल और PHP के साथ भी चिंतित हैं प्रिय parse_ini विधि इसे पढ़ने के लिए, जाने के लिए रास्ता है (यदि आप किसी अन्य प्रोग्रामिंग भाषा के लिए जा रहे हैं, तो आप अपने स्वयं के समान दृष्टिकोणों का पता लगा रहे हैं)! आमतौर पर मैं इस फाइल को एप्लिकेशन के बूटलोडर में पढ़ता हूं और इसे स्थिर वस्तु (शायद शीर्ष पर एक कैश लेयर के साथ) में रख सकता हूं, अगर हम बहुत अधिक संख्या में विभिन्न प्रश्नों के बारे में बात कर रहे हैं तो वास्तव में तेजी ला सकते हैं।


1

यदि आपको केवल एक बार SQL कथन की आवश्यकता होती है, उदाहरण के लिए, यदि आप ऑफ-ऑवर के दौरान प्रदर्शन करने के लिए संचालन के एक समूह की कतार बना रहे हैं, तो हाँ, उन्हें एक तालिका में रखना ठीक काम करेगा।

यदि आपको निर्दिष्ट अंतराल पर एक ही एसक्यूएल स्टेटमेंट को निष्पादित करने की आवश्यकता है, तो दूसरों द्वारा उल्लेखित संग्रहीत कार्यविधि मार्ग आपके लिए एक बेहतर विकल्प होने की संभावना है।

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

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