在 SQL Server 中,是否可以DB_ID
从调用堆栈更远的上下文中获取 ?
我的目标是在开发沙箱数据库中创建一些方便的(并且公认的 hacky)实用程序函数,使获取对象的完全限定名称变得简单而简洁,给定它们的短名称或碎片名称,另外删除使用相同短名称的对象. 这些实用程序函数将位于单个实用程序数据库中,但会从同一服务器上的其他数据库调用。
从我从测试中可以看出:
ORIGINAL_DB_NAME()
按预期返回连接字符串中的任何内容,而不是当前上下文(由 设置USE [dbname]
)。DB_NAME()
返回定义该函数的数据库的名称。另一种说法是,函数或存储过程内的上下文是定义它的数据库的上下文我知道引擎会跟踪调用堆栈上下的每个数据库上下文(请参见下面的证明)。那么有没有办法访问这些信息呢?
我希望能够在调用者数据库的上下文中查找和操作对象,即使执行代码不在同一个数据库中。例如:
use SomeDB
EXEC util.dbo.frobulate_table 'my_table'
Run Code Online (Sandbox Code Playgroud)
我知道我能做到
EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table'
Run Code Online (Sandbox Code Playgroud)
但我真的很好奇是否可以通过这种方式查询调用堆栈。
更新/注意
我确实从Gabriel McAdams 的博客中阅读并下载了代码。这提供了堆栈上下调用过程 ID 的记录,但仍然假设所有内容都在同一个数据库中。
证明 SQL Server 记住了数据库上下文上下调用堆栈
示例:在具有数据库 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
510 次 |
最近记录: |