SQL Server'da, DB_IDbağlamdan çağrı yığınına kadar yukarıdan almak mümkün müdür ?
Amacım, dev sandbox veritabanında kısa veya parçalanmış adları verilen nesnelerin tam adlarını almayı kolay ve özlü hale getiren ve ayrıca aynı kısa adı kullanarak nesneleri silmeyi sağlayan bazı kullanışlı (ve kuşkusuz hacky) yardımcı işlevler oluşturmaktır. . Bu yardımcı program işlevleri tek bir yardımcı program veritabanında yer alır, ancak aynı sunucudaki diğer veritabanlarından çağrılır.
Testten görebildiğim kadarıyla:
ORIGINAL_DB_NAME()amaçlandığı gibi, bağlantı dizesinde ne varsa döndürür, geçerli bağlamı değil (ile ayarlanırUSE [dbname]).- Bir işlevde çağrıldığında, o işlevin tanımlandığı
DB_NAME()veritabanının adını döndürür . Bunu söylemenin başka bir yolu, bir işlev veya saklı yordam içindeki bağlamın tanımlandığı veritabanının
Motor arama yığını yukarı ve aşağı her veritabanı bağlamlarını izler biliyorum (kanıt için aşağıya bakın). Peki bu bilgilere erişmenin herhangi bir yolu var mı?
Ben yürütme kodu aynı veritabanında olmasa bile, bulmak ve arayan veritabanı bağlamında nesneler üzerinde çalışabilmek istiyorum. Örneğin:
use SomeDB
EXEC util.dbo.frobulate_table 'my_table'
Sadece yapabileceğimi biliyorum
EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table'
Ancak, çağrı yığınını bu şekilde sorgulamanın mümkün olup olmadığını gerçekten merak ediyorum.
Güncelleme / not
Kodu Gabriel McAdams'ın blogundan okudum ve indirdim . Bu, yordam yukarı ve aşağı çağıran yordam kimliğinin bir kaydını sağlar, ancak yine de her şeyin aynı veritabanında olduğunu varsayar.
Kanıt SQL Server DB bağlamı yukarı ve aşağı çağrı yığını hatırlıyor
Örnek: TestDB1 ve TestDB2 veritabanlarına sahip bir geliştirici sunucusunda
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 proc yazdırır:
Before, DB_NAME inside dbo.ECHO_STACK : TestDB2
TestDB1.dbo.ECHO_DB_NAME returned : TestDB1
After, DB_NAME inside dbo.ECHO_STACK : TestDB2
DROPifade oluşturmak için tanımlanmış nesnenin türünü kullanan başka bir örneğim).
USE xyz;?