我正在运行一个删除数据库然后恢复数据库的T-SQL脚本.该脚本针对SQL Server 2008数据库运行.有时备份文件存在问题,数据库卡在恢复状态.
IF EXISTS (SELECT 1 FROM master.dbo.sysdatabases WHERE name = 'dbname')
BEGIN
ALTER DATABASE [dbname]
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE
END
IF EXISTS (SELECT 1 FROM master.dbo.sysdatabases WHERE name = 'dbname')
BEGIN
DROP DATABASE [dbname]
END
RESTORE DATABASE [dbname]
FROM DISK = N'C:\dbname.bak'
WITH FILE = 1,
NOUNLOAD,
STATS = 10
Run Code Online (Sandbox Code Playgroud)
脚本下次运行时脚本会生成错误消息
ALTER DATABASE is not permitted while a database is in the Restoring state.
Run Code Online (Sandbox Code Playgroud)
在尝试运行ALTER DATABASE命令之前,检查数据库是否处于恢复状态的最佳方法是什么?
编辑:我正在运行的RESTORE DATABASE命令不使用NO RECOVERY选项.
Joh*_*som 25
听起来好像您正在使用该NORECOVERY选项执行数据库还原.您希望这样做的原因是您计划在初始恢复后应用后续事务日志备份.
如果您只希望还原单个数据库备份,请删除该NORECOVERY子句.如果要还原事务日志备份,最后恢复必须没有完成NORECOVERY条款或如果最后与应用NORECOVERY,你可以RESTORE DATABASE DbName WITH RECOVERY敲定.
回答你的问题:
方法1
SELECT DATABASEPROPERTYEX ('DatabaseName', 'Status')
Run Code Online (Sandbox Code Playgroud)
请参见SQL Server联机丛书:DATABASEPROPERTYEX(Transact-SQL)
方法2
查看sys.databases系统视图以确定数据库的当前状态.例如:
SELECT
state,
state_desc
FROM sys.databases
WHERE [name] = 'DatabaseName'
Run Code Online (Sandbox Code Playgroud)
状态为1 =恢复
有关此系统视图的文档,请参阅Sys.Databases.