ऊपर से DB_ID संदर्भ कॉल स्टैक


11

SQL सर्वर में, DB_IDकॉल स्टैक को आगे से संदर्भ से प्राप्त करना संभव है ?

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

परीक्षण से मैं क्या देख सकता हूं:

  • ORIGINAL_DB_NAME()जैसा कि इरादा रिटर्न जो कुछ भी कनेक्शन स्ट्रिंग में था, न कि वर्तमान संदर्भ (द्वारा निर्धारित USE [dbname])।
  • जब किसी फ़ंक्शन में कॉल किया जाता है DB_NAME()तो डेटाबेस का नाम उस फ़ंक्शन को परिभाषित करता है । यह कहने का एक और तरीका यह है कि किसी फ़ंक्शन या संग्रहीत प्रक्रिया के अंदर का संदर्भ उस डेटाबेस का है जिसमें इसे परिभाषित किया गया है

मुझे पता है कि इंजन प्रत्येक डेटाबेस संदर्भ को कॉल स्टैक के ऊपर और नीचे ट्रैक करता है (सबूत के लिए नीचे देखें)। तो क्या इस जानकारी तक पहुंचने का कोई तरीका है?

मैं कॉलर के डेटाबेस के संदर्भ में ऑब्जेक्ट्स को खोजने और संचालित करने में सक्षम होना चाहता हूं, भले ही निष्पादन कोड एक ही डेटाबेस में नहीं है। उदाहरण के लिए:

use SomeDB
EXEC util.dbo.frobulate_table 'my_table'

मुझे पता है कि मैं बस कर सकता हूं

EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table'

लेकिन मैं वास्तव में उत्सुक हूं अगर इस तरह से कॉल स्टैक को क्वेरी करना संभव है।

अद्यतन / नोट

मैंने गेब्रियल मैकएडम्स के ब्लॉग का कोड पढ़ा और डाउनलोड किया । यह कॉलिंग प्रक्रिया आईडी का रिकॉर्ड ऊपर और नीचे स्टैक प्रदान करता है लेकिन फिर भी मानता है कि सब कुछ एक ही डेटाबेस में है।

एसक्यूएल सर्वर प्रूफ को डीबी संदर्भ ऊपर और नीचे कॉल स्टैक याद करता है

उदाहरण: डेटाबेस परीक्षण के साथ एक dev सर्वर पर TestDB1 और TestDB2

use TestDB1
GO
CREATE FUNCTION dbo.ECHO_DB_NAME() RETURNS nvarchar(128) BEGIN RETURN DB_NAME() END
GO

use TestDB2
GO
CREATE PROCEDURE dbo.ECHO_STACK AS 
BEGIN
    DECLARE @name nvarchar(128)
    SET @name = DB_NAME()
    PRINT 'Before, DB_NAME inside dbo.ECHO_STACK : ' + @name
    SET @name = TestDB1.dbo.ECHO_DB_NAME()        
    PRINT 'TestDB1.dbo.ECHO_DB_NAME returned     : ' + @name
    SET @name = DB_NAME()
    PRINT 'After, DB_NAME inside dbo.ECHO_STACK  : ' + @name
END
GO

use master
SELECT DB_NAME()  -- Returns 'master'
EXEC TestDB2.dbo.ECHO_STACK 

ECHO_STACK खरीद प्रिंट:

Before, DB_NAME inside dbo.ECHO_STACK : TestDB2
TestDB1.dbo.ECHO_DB_NAME returned     : TestDB1
After, DB_NAME inside dbo.ECHO_STACK  : TestDB2

यह विस्तारित घटनाओं के माध्यम से संभव होगा, लेकिन केवल एक नवीनता के रूप में। गंभीर उत्पादन उपयोग के लिए कुछ नहीं। यहां तक ​​कि अगर आप डेटाबेस का नाम जानते हैं, तो आप इसे कैसे भी उपयोग करेंगे? एक USE xyz;पूर्ववर्ती के साथ गतिशील sql में सब कुछ है?
मार्टिन स्मिथ

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

@SQLKiwi प्रश्न तदनुसार अपडेट किया गया। अन्य उत्तर के लिए भी धन्यवाद। मेरे पास पहले से ही स्ट्रिंग हेरफेर के लिए विभिन्न प्रकार के सीएलआर कार्य हैं, इसलिए यह मेरे लिए एक प्राकृतिक अगला कदम होना चाहिए।
जोशुआ होनिग

जवाबों:


4

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


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