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
DROPस्टेटमेंट बनाने के लिए पहचाने गए ऑब्जेक्ट के प्रकार का भी उपयोग करता है ।
USE xyz;पूर्ववर्ती के साथ गतिशील sql में सब कुछ है?