这有点像“鸡或蛋”类型的查询,但有人能想出一个可以返回执行查询的当前数据库实例名称的查询吗?当我说我理解这个悖论时请相信我:如果您已经连接到执行查询,为什么还需要知道数据库实例的名称?在多数据库环境中进行审计。
我查看了联机丛书中的所有@@ 全局变量。 “ SELECT @@servername
” 很接近,但我想要数据库实例的名称而不是服务器的名称。
原文由 flipdoubt 发布,翻译遵循 CC BY-SA 4.0 许可协议
这有点像“鸡或蛋”类型的查询,但有人能想出一个可以返回执行查询的当前数据库实例名称的查询吗?当我说我理解这个悖论时请相信我:如果您已经连接到执行查询,为什么还需要知道数据库实例的名称?在多数据库环境中进行审计。
我查看了联机丛书中的所有@@ 全局变量。 “ SELECT @@servername
” 很接近,但我想要数据库实例的名称而不是服务器的名称。
原文由 flipdoubt 发布,翻译遵循 CC BY-SA 4.0 许可协议
我不确定你到底在问什么。当您为审计需要编写此过程时,我猜您是在问当存储过程存在于另一个数据库中时如何获取当前数据库名称。例如
USE DATABASE1
GO
CREATE PROC spGetContext AS
SELECT DB_NAME()
GO
USE DATABASE2
GO
EXEC DATABASE1..spGetContext
/* RETURNS 'DATABASE1' not 'DATABASE2' */
这是正确的行为,但并不总是您想要的。为了解决这个问题,您需要在主数据库中创建 SP 并将该过程标记为系统过程。执行此操作的方法在 SQL Server 版本之间有所不同,但这里是 SQL Server 2005 的方法(可以在 2000 年使用 master.dbo.sp_MS_upd_sysobj_category
函数执行此操作)。
USE MASTER
/* You must begin function name with sp_ */
CREATE FUNCTION sp_GetContext
AS
SELECT DB_NAME()
GO
EXEC sys.sp_MS_marksystemobject sp_GetContext
USE DATABASE2
/* Note - no need to reference master when calling SP */
EXEC sp_GetContext
/* RETURNS 'DATABASE2' */
希望这就是你要找的
原文由 Ollie 发布,翻译遵循 CC BY-SA 2.5 许可协议