2011-05-12 9 views
14

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

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

इंटरनेट वेब एप्लिकेशन एक रीस्टफुल एपीआई के साथ स्थापित किया गया है जो सार्वजनिक रूप से सुलभ यूआरएल (उदा। http://www.example.com/records/new) पर फॉर्म पोस्ट के माध्यम से नए रिकॉर्ड प्राप्त कर सकता है।

क्या किसी को पता है कि यूआरएल के माध्यम से डेटा भेजना (यूआरएल, जेसन, यूआरएल में सादा चर) एसक्यूएल सर्वर में पूरा किया जा सकता है?

किसी भी विचार के लिए धन्यवाद!

उत्तर

7

एक अच्छा (बल्कि विश्वसनीय और स्केलेबल) विकल्प के रूप में, आप वेब एप्लिकेशन/वेब सेवा के साथ बातचीत करने के लिए SQL CLR का उपयोग कर सकते हैं।

उदाहरण के लिए, SQL CLR WebRequest या SQL CLR WCF

+1

या एसएसआईएस - एकीकरण सेवाएं। –

+0

@marc_s: मेरे बहुत ही पहुंच अनुभव से, एसएसआईएस अधिक जटिल विषय है तो एसक्यूएलसीएलआर – abatishchev

+0

@marc_s एसएसआईएस के साथ भी आप सी # लिखना चाहते हैं क्योंकि यह अक्सर पर्याप्त लचीला नहीं होता है। – John

13

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

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

समाधान एक कतार के माध्यम से HTTP अनुरोध से ट्रिगर को डीक्यूपल करना है। ट्रिगर स्थानीय कतार में अनुरोध को स्वीकार करता है और करता है, जबकि प्रसंस्करण का एक अलग टुकड़ा इन अनुरोधों को अस्वीकार करता है और HTTP अनुरोध जारी करता है। यह ऊपर बताई गई दोनों समस्याओं को हल करता है। आप कतारों के लिए सामान्य सारणी का उपयोग कर सकते हैं (Using Tables as Queues देखें) या आप Service Broker का उपयोग कर सकते हैं, दोनों अच्छी तरह से काम करते हैं।

अब इस अनुरोध को अस्वीकार करने और वास्तव में HTTP कॉल रखने के तरीके पर, मैं दृढ़ता से एक समर्पित प्रक्रिया (यानी इस उद्देश्य के लिए समर्पित एक आवेदन) का उपयोग करने की सलाह देता हूं। हालांकि SQLCLR का उपयोग करना संभव है, यह एक बहुत ही खराब विकल्प है। एसक्यूएल सर्वर संसाधन (विशेष रूप से workers) इंटरनेट प्रतिक्रियाओं के इंतजार पर बर्बाद करने के लिए बहुत मूल्यवान हैं।

+0

मैं एक http अनुरोध की प्रतीक्षा नहीं कर रहा हूं। मैं चाहता हूं कि ट्रिगर http अनुरोध शुरू करे। मैं चाहता हूं कि एक नया रिकॉर्ड अपडेट होने पर ट्रिगर एक यूआरएल कॉल करे।मुझे इसकी प्रतिक्रिया या किसी भी –

+1

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

0

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

संबंधित मुद्दे