Я пытаюсь написать фрагмент кода для удаления и воссоздания базы данных MS SQL в PowerShell с использованием некоторых команд Invoke-Sqlcmd (вызванных ошибкой в наших системах). Я хотел бы создать некоторые непредвиденные обстоятельства в этом случае, если другая программа на целевой машине будет обращаться к базе данных в момент выдачи команды drop. Я думал, что хороший способ сделать это будет путем вложения одной команды Try/Catch/Finally внутри другого, например;PowerShell - команды вложения/вставки/вложения
$strDbName= database
$strUsername= user
$strPassword= pass
$strmdfFilePath= "C:\foo.mdf"
$strldfFilePath= "C:\bar.ldf"
Try
{
Write-Host "INFO: Attempting Database DROP command..."
Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "DROP database [$strDbName];"
}
Catch
{
Try
{
Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "ALTER database [$strDbName] set offline with ROLLBACK IMMEDIATE;"
Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "DROP database [$strDbName];"
}
Catch
{
Write-Host "Error message"
}
Finally
{
Exit
}
}
Finally
{
Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "CREATE DATABASE [$strDbName] ON (FILENAME = '$dirMdfFilePath'),(FILENAME = '$dirLdfFilePath') for ATTACH;"
}
Два вопроса - A) Выполняет ли вложенные команды Try/Catch/Finally на самом деле? и В) Является ли этот тип последовательности команд хорошей практикой? У меня нет тестовой машины, чтобы попробовать это, и если бы был более простой способ выполнить такую команду, я бы предпочел знать.
Возможно, вы можете их разложить. Я бы задался вопросом в вашем случае, если вы можете избежать этого, проверив состояние таблицы перед рукой (я не знаю, как это сделать вообще). Это изменить команду ... Почему бы просто не отключить ее в первую очередь? – Matt
Привет, Мэтт, я просмотрел это, и это возможно, запросив базу данных для Open Connections. Метод, который я предложил, определенно не кажется самым изящным способом делать то, что я хочу, поэтому я могу исследовать этот ход реализации какой-либо защитной кодировки в процессе. – Fredulom
Чтобы следить за этим, я нашел следующую информацию; если вы установите переменную как Microsoft.SqlServer.Management.Smo.Server, вы можете использовать метод GetActiveDBConnectionsCount («foobar») для вывода текущего количества подключений к конкретной базе данных. – Fredulom