जब हम किसी फ़ंक्शन को कहते हैं तो स्कीमा उपसर्ग (dbo) अनिवार्य क्यों है?


9

जब उपयोगकर्ता को डिफ़ॉल्ट स्कीमा (dbo) के साथ मैप किया जाता है और हम स्कीमा को प्रीफ़िक्स किए बिना [dbo] के अंतर्गत सभी तालिकाओं का चयन कर सकते हैं।

हम उपसर्ग के बिना संग्रहीत प्रक्रियाओं को निष्पादित कर सकते हैं यदि यह डिफ़ॉल्ट स्कीमा के तहत है।

यह देखते हुए, हमें स्कीमा के साथ एक फ़ंक्शन को उपसर्ग करने की आवश्यकता क्यों है?

धन्यवाद!

जवाबों:


11

फिर हम dbo के तहत प्रीफ़िक्स (स्कीमा) के बिना फ़ंक्शन को क्यों कह सकते हैं?

यूडीएफ पर पुस्तकें ऑनलाइन दस्तावेज़ से

स्केलर-मूल्यवान फ़ंक्शंस को लागू किया जा सकता है जहां स्केलर अभिव्यक्तियों का उपयोग किया जाता है। इसमें कंप्यूटेड कॉलम और CHECK बाधा परिभाषाएं शामिल हैं। स्केलर-मूल्यवान कार्यों को EXECUTE स्टेटमेंट का उपयोग करके भी निष्पादित किया जा सकता है। फ़ंक्शन के कम से कम दो-भाग नाम का उपयोग करके स्केलर-मूल्यवान कार्यों को लागू किया जाना चाहिए

तो यह मूल रूप से SQL सर्वर विकास टीम द्वारा निर्धारित प्रतिबंध है और मैं इसे काफी सही मानता हूं। यहां तक ​​कि अगर यह किसी भी तरह की अनुमति है (सिर्फ बातचीत के लिए) मैं अभी भी स्कीमा उपसर्ग का उपयोग करूंगा।

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

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


फिर यह एसपी के साथ अलग क्यों है। जैसा कि आपने कहा कि यह नामकरण टकराव से बचने के लिए हो सकता है। मैंने अपने उपयोगकर्ता डेटाबेस में केवल एक SP "create प्रक्रिया sp_help का चयन करें जैसा कि getdate ()" के रूप में किया है और जब मैं स्कीमा (dbo) के साथ या उसके बिना निष्पादित करता हूं, तो SQL सर्वर सिस्टम SP को संदर्भित करता है। क्यों यह मेरे एसपी को निष्पादित नहीं करता है जो मैंने बनाया है।
राजेश रंजन

1
@rajeshRajan चूंकि आपके पास sp_procname है (आपने SP के साथ अपनी प्रक्रिया को उपसर्गित किया है) यह SQL सर्वर को संकलित योजना के लिए पहले मास्टर डेटाबेस में देखने के लिए मजबूर करता है और चूंकि यह डेटाबेस मास्टर डेटाबेस में मौजूद है, इसलिए इसे निष्पादित नहीं किया गया है, तो यह आपके डेटाबेस में नहीं होगा। मास्टर में तो यह तुम्हारा ही होगा। आपको उपसर्ग sp_ के साथ कभी भी खरीदारी नहीं करनी चाहिए क्योंकि इसमें प्रदर्शन संबंधी समस्याएं हैं।
Shanky

मुझे लगता है कि Shanky ने "क्यों" प्रश्न का उत्तर सीधे दिया जब उन्होंने उल्लेख किया कि यह SQL सर्वर विकास टीम द्वारा निर्धारित किया गया था। आप पूछ सकते हैं कि उन्होंने ऐसा क्यों किया और कार्यों का व्यवहार प्रक्रियाओं के साथ असंगत क्यों है, लेकिन जवाब शायद बहुत ज्यादा मायने नहीं रखता है।
माइकल जे। स्वार्ट

1
BTW, "sp_" से शुरू होने वाली प्रक्रियाओं के प्रदर्शन प्रभाव को मापा नहीं जा सकता है। यह वर्षों से कोई समस्या नहीं है। सपा उपसर्ग अभी भी एक अच्छा विचार नहीं हो सकता है, लेकिन प्रदर्शन कारण नहीं है।
माइकल जे स्वार्ट

10

अन्य उत्तर बताते हैं कि यह एक प्रतिबंध है, लेकिन इसका कारण नहीं है।

आवश्यकता हमेशा सच नहीं होती है। स्केलर UDFs EXEC-ed हो सकता है और अभी भी निहित संकल्प ( उदाहरण ) का उपयोग कर सकता है

मुझे लगता है कि यह नामकरण टकराव से बचने के लिए है।

यदि फ़ंक्शन को स्कीमा के बिना संदर्भित करने की अनुमति दी गई थी, तो किसी ने अपना स्वयं का फ़ंक्शन बनाया जो कि crypt_gen_random2000 या 2005 में कहा जाता है , बाद के संस्करण में अपग्रेड करने में समस्याओं का सामना करना पड़ेगा क्योंकि यह 2008 में एक फ़ंक्शन का निर्माण किया गया था।

execउपयोग के साथ कोई अस्पष्टता नहीं है जैसा कि कार्यों में बनाया गया है, ऐसा नहीं कहा जा सकता है।


फिर यह एसपी के साथ अलग क्यों है। जैसा कि आपने कहा कि यह नामकरण टकराव से बचने के लिए हो सकता है। मैंने अपने उपयोगकर्ता डेटाबेस में केवल एक SP "create प्रक्रिया sp_help का चयन करें जैसा कि getdate ()" के रूप में किया है और जब मैं स्कीमा (dbo) के साथ या उसके बिना निष्पादित करता हूं, तो SQL सर्वर सिस्टम SP को संदर्भित करता है। क्यों यह मेरे एसपी को निष्पादित नहीं करता है जो मैंने बनाया है।
राजेश रंजन

3
@Rajesh। Sp_ शुरू करने वाली वस्तुएं हमेशा मास्टर / संसाधन डेटाबेस में देखने के लिए विशेष रूप से आवरण वाली होती हैं। और यह प्रलेखित है कि इस उपसर्ग से बचा जाना चाहिए। अंतर्निहित कार्यों के लिए ऐसा कोई सम्मेलन नहीं है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.