【问题标题】:How can i use master db in stored procedures如何在存储过程中使用主数据库
【发布时间】:2016-06-03 16:07:36
【问题描述】:

我正在尝试创建恢复数据库过程。我遇到了一个问题,因为我无法使用命令'use master'。我尝试使用动态 SQL,但没有结果: 我的代码:

alter proc dbo.RestoreDB
 (
 @location as varchar(4000) 
 )

as
begin

declare @setMasterDb as varchar(400) = 'use master' 

exec (@setMasterDb);


ALTER DATABASE [testDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [testDb] FROM  DISK = @location WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
ALTER DATABASE [testDb] SET MULTI_USER

end

GO

有解决办法吗?

【问题讨论】:

  • 我认为您不需要切换到 master 来运行恢复...
  • 另外,我不认为在 SQL 中允许在存储过程中间切换数据库上下文,但我没有这方面的来源,只是让我脑后发痒。
  • 试试 addimg go like "'use master; go ;"
  • 正如@Kalmino 所说,您不能在存储过程中切换数据库上下文。您的存储过程可以驻留在您要恢复的数据库以外的数据库中。您可能希望为此过程或您创建的任何其他数据库创建自己的数据库。即DevMetricsDbaMetrics

标签: sql sql-server sql-server-2014


【解决方案1】:

不允许在存储过程(或函数)中间切换数据库上下文 (USE someDBName)。此外,您无需指向主数据库上下文即可运行备份/恢复,您几乎可以指向任何数据库。要解决您的问题,只需移除您的数据库切换并将您的查询窗口指向除您要恢复的数据库之外的任何数据库。

编辑:更新为指向任何数据库,除了您尝试恢复的数据库。感谢@DMason 的评论。

【讨论】:

  • 注意:您无法恢复当前连接的数据库。至少,您的连接将在数据库上具有意图共享锁。尝试恢复它会导致Error - Exclusive access could not be obtained because the database is in useAdditional Info
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2010-11-21
  • 2023-01-02
  • 2018-05-04
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多