Php 用于还原SQL Server数据库的脚本失败

Php 用于还原SQL Server数据库的脚本失败,php,sql-server,Php,Sql Server,我正在尝试使用PHP脚本恢复SQL Server数据库,但一直失败。我使用的是PHP7.0.4NTSx86。因为我的代码是在一个框架内运行的,所以我决定隔离并运行我在这里找到的代码(这也在StackOverflow的另一个回答中指出): 代码如下: // Set error mode to make sure errors throw exceptions sqlsrv_configure('WarningsReturnAsErrors', 1); // Try to connect $con

我正在尝试使用PHP脚本恢复SQL Server数据库,但一直失败。我使用的是PHP7.0.4NTSx86。因为我的代码是在一个框架内运行的,所以我决定隔离并运行我在这里找到的代码(这也在StackOverflow的另一个回答中指出):

代码如下:

// Set error mode to make sure errors throw exceptions
sqlsrv_configure('WarningsReturnAsErrors', 1);

// Try to connect
$conn = sqlsrv_connect(
    'localhost',
    ['Database'=>'master', 'UID'=>'sa', 'PWD'=>'mypassword', 'ReturnDatesAsStrings'=>true, 'CharacterSet'=>'UTF-8']
);

$sql = "RESTORE DATABASE MYDB FROM DISK='c:\\MYDB.bak' WITH RECOVERY";
echo $sql."<br>"; 
$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors())); 
} 
else 
{ 
    echo "Database restored</br>"; 
}

//Put DB into usable state. 
$sql = "USE MYDB"; 
echo $sql."<br>"; 
$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors())); 
} 
else 
{ 
    echo "Using MYDB</br>"; 
}
数据库已创建,但只是以还原模式显示。如果我尝试使用同一个用户从SSMS运行相同的命令,那么效果很好。另一件有趣的事情是,如果我查看SQL Server日志,每次尝试后都会看到:

2017-03-10 09:33:12.37 spid57      The database 'MYDB' is marked RESTORING and is in a state that does not allow recovery to be run.
2017-03-10 09:33:34.76 spid57      Starting up database 'AdventureWorks2008R2'.
2017-03-10 09:33:34.80 spid57      Starting up database 'ReportServer'.
2017-03-10 09:33:34.83 spid57      Starting up database 'ReportServerTempDB'.
不确定为什么每次尝试恢复后都会启动相同的3个数据库


我还尝试使用PDO进行恢复,结果相同,数据库处于恢复模式。

SQL Server以几乎相同的方式打印警告和错误,只是使用不同的严重性级别,以便客户端软件能够了解差异并采取适当的措施

我不懂PHP,所以我不确定你想用这行代码实现什么

sqlsrv_configure('WarningsReturnAsErrors', 1);

但从听起来,这使得来自SQL Server的严重性较低的“警告”消息被客户机代码视为实际错误。将该值设置为0,我猜您的脚本将继续通过还原数据库消息,并将它们视为信息性消息而不是异常消息。

此处是暗中拍摄的,但不知道在还原完成之前是否正在执行
使用MYDB
查询。你能做一些像在你的查询之间抛出一个
sleep()
,看看这是否可行的黑客行为吗?@EatPeanutButter因为die()的原因,它甚至无法到达代码的那一部分。但由于发生了一些奇怪的事情,我还是尝试了一下,它证实了这一点,剧本甚至从不睡觉,因为它从来没有走那么远。我在发布这篇文章后不久就意识到了这一点。注意到在SSMS中成功输出的同一文本作为错误输出是没有意义的,我认为这可能是一个警告被转换为错误并停止进程。看来你比我想得快多了,谢谢你的回答,你赢了!
sqlsrv_configure('WarningsReturnAsErrors', 1);