এসকিউএল সার্ভারে, 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'
এইভাবে কল স্ট্যাকের ক্যোয়ারী করা যদি সম্ভব হয় তবে আমি সত্যিই কৌতূহলী।
আপডেট / নোট
আমি গ্যাব্রিয়েল ম্যাকএডামস ব্লগ থেকে কোডটি পড়েছি এবং ডাউনলোড করেছি । এটি স্ট্যাকের উপরে এবং নিচে কলিং প্রক্রিয়া আইডির একটি রেকর্ড সরবরাহ করে তবে এখনও ধরে নেয় সবকিছু একই ডাটাবেসে রয়েছে।
প্রুফ এসকিউএল সার্ভার ডিবি প্রসঙ্গটি আপ এবং ডাউন কল স্ট্যাক মনে রাখে
উদাহরণ: ডেটাবেস টেস্টডিবি 1 এবং টেস্টডিবি 2 সহ একটি ডেভ সার্ভারে
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;পূর্ববর্তী রয়েছে?