Сценарий Powershell для автоматического удаления, загрузки и восстановления базы данных SQL не выполняется полностью

С помощью некоторых онлайн-ресурсов я скомпилировал сценарий PowerShell, который:

  • Удалите любой файл старше 60 минут в заданной папке
  • Подключитесь к серверу SFTP и загрузите один файл .bak.
  • Восстановите загруженный файл .bak в экземпляр SQL

Код работает нормально, если я разобью его и запустил индивидуально. Однако, когда я их объединяю, он работает до восстановления и просто останавливается. Ниже приведен код. Любая помощь в определении того, почему я могу выбрать сценарий восстановления, запустить только его, и он работает, но не когда он запускается в целом, будет полезен.

Обновление 1: я создал упрощенную версию кода, которая все еще не работает, но имеет только соединение с использованием WINSCP, завершение процесса SSMS и восстановление. Для меня процесс уничтожения - это просто визуальная очередь, чтобы увидеть, как он выполняется.

Обновление 2: я обнаружил, что если поместить сценарий восстановления в session.open, он будет работать нормально. Однако мне неудобно оставлять сеанс открытым, поскольку sql его восстанавливает, это кажется ... не знаю, как это сказать, но неправильно.

$localPath = "C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\Backup\"

# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "url.com"
    UserName = "username"
    Password = "password"
    SshHostKeyFingerprint = "ssh stuff"
}

$session = New-Object WinSCP.Session
    try
    {
        # Connect
        $session.Open($sessionOptions)

    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }  
    exit 0
catch
{ 
   Write-Host "Error: $($_.Exception.Message)"    
    exit 1
}

        #restore database
        $Program = Get-Process SSMS -erroraction SilentlyContinue
        if ($Program)
        {
        $Program.closeMainWindow()
        Sleep 5
        If (!$Program.hasexited)
        {
        $program | stop-process -force
        }
        }
        remove-variable Program
        $FileNam = Get-ChildItem -path $localpath

        Restore-SqlDatabase -ServerInstance "machine\instance" -Database "Test" -BackupFile $FileName -ReplaceDatabase

Зачем ты убиваешь SSMS так? При восстановлении базы данных в этом нет необходимости.

alroc 17.12.2018 23:21

Сколько файлов в $path при вызове $FileName = Get-ChildItem -path $path?

sticky bit 17.12.2018 23:33

Убейте ssms в качестве меры предосторожности на случай, если кто-то окажется в нем. Скрипт запускается в 7 утра после того, как сервер отключается, просто перебор. В папке всего 1 файл. Я использую get-childitem, поскольку имя меняется изо дня в день.

Christian 17.12.2018 23:37

«работает до восстановления и просто останавливается». Возможно, он восстанавливается - войдите в SQL Server и используйте sp_who2 для проверки активности на SQL Server.

Nick.McDermaid 18.12.2018 06:59

Привет, Ник, спасибо за информацию. Проверил, и он не показал, что скрипт PowerShell запущен. Я также подтвердил, что он не восстанавливается, потому что изменения, сделанные до запуска скрипта, не были возвращены (я изменил несколько значений на NULL для проверки).

Christian 18.12.2018 15:40
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
507
1

Ответы 1

Ответ решен / найден. Перемещение восстановления в раздел «попробовать» разрешило его, даже если оно было удалено после удаления соединения. Скорее всего, это связано с выходом 0. Другое решение - полностью удалить коды try / catch и exit.

Другие вопросы по теме