Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
Доброго времени суток
помогите разобраться , я пытаюсь попросить PS чтоб он мне выполнил на 2х инстансах определенне скрипты в файлах

Проблема в том , что уже мною протестировано, если в файле обычного рода запрос типа select @@servername
то скрипт отпрабатывает и показывает что он выполнил, а вот если :

сам скрипт для powershell + ниже текст скрипта для одного из файлов то ничего не происходит.! (((

+
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlCatalog = "master";
$SqlLogin = "sa";
$arrayofDATA=@(
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\analit.sql'
SERVER="."
Pass="123456"
}),
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\kassa.sql'
SERVER=".\KASSA"
Pass="654321"
}))
 
foreach($data in $arrayofDATA)
{
    $SERV=$data.Server
    $PATH=$data.PATH
    $Pass=$data.Pass
    $SqlConnection.ConnectionString = "Server=$SERV; Database=$SqlCatalog; User ID=$SqlLogin; Password=$Pass;"
    $SqlConnection.Open()
    $SqlCmd = $SqlConnection.CreateCommand()
    $SqlCmd.CommandText = gc ($PATH)
    $objReader = $SqlCmd.ExecuteReader()
    while ($objReader.read()) {
    echo $objReader.GetValue(0)
    }
    $objReader.close()
    $SqlConnection.Close()
}


и один из файлов который я хочу чтоб был отработан
+
DECLARE @Path varchar(255), @Comand VARCHAR(8000), @DBtoRestore nVARCHAR(50), @sql VARCHAR(8000),  @str VARCHAR(8000) --@DBtoRestore NVARCHAR(4000)
select @Path  = 'Z:\Etalon_backups\'
if OBJECT_ID('tempdb..#dir') IS NOT NULL DROP TABLE #dir
create table #dir (f_name varchar(256))
set @Comand = 'dir ' + @Path + '*.bak'
insert into #dir exec master..xp_cmdshell @Comand
delete from #dir where f_name NOT LIKE '%.bak' OR f_name IS null
if OBJECT_ID('tempdb..#DBs') IS NOT NULL DROP TABLE #DBs
CREATE TABLE #DBs (DBName VARCHAR(50))
INSERT INTO #DBs
SELECT REVERSE(SUBSTRING(reverse(f_name), 1, CHARINDEX(' ',reverse(f_name))-1 )) FROM #dir
--CREATE DATABASE OtSigns
USE master 
IF NOT EXISTS (SELECT 1 FROM sysdatabases WHERE name = 'OtSigns')
CREATE DATABASE OtSigns
ALTER DATABASE OtSigns SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE OtSigns SET MULTI_USER
SELECT @DBtoRestore = DBName FROM #DBs WHERE DBName LIKE 'OtSigns%'
EXEC(
'RESTORE DATABASE OtSigns 
FROM  DISK = ''Z:\Etalon_backups\'+@DBtoRestore+'''
WITH  MOVE ''OtSigns'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OtSigns.mdf'',
MOVE ''OtSigns_log'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OtSigns_log.ldf'', REPLACE'
)
ALTER DATABASE OtSigns SET RECOVERY FULL 
IF NOT EXISTS (SELECT 1 FROM sysdatabases WHERE name = 'OTData')
CREATE DATABASE OTData
ALTER DATABASE OTData SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE OTData SET MULTI_USER
SELECT @DBtoRestore = DBName FROM #DBs WHERE DBName LIKE 'OTData%'
EXEC(
'RESTORE DATABASE OTData 
FROM  DISK = ''Z:\Etalon_backups\'+@DBtoRestore+'''
WITH  MOVE ''OTData_D'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OTData.mdf'',
MOVE ''OTData_L'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OTData_log.ldf'', REPLACE'
)
ALTER DATABASE OTData SET RECOVERY FULL
IF NOT EXISTS (SELECT 1 FROM sysdatabases WHERE name = 'OTUtils')
CREATE DATABASE OTUtils
ALTER DATABASE OTUtils SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE OTUtils SET MULTI_USER
SELECT @DBtoRestore = DBName FROM #DBs WHERE DBName LIKE 'OTUtils%'
EXEC(
'RESTORE DATABASE OTUtils 
FROM  DISK = ''Z:\Etalon_backups\'+@DBtoRestore+'''
WITH  MOVE ''OTUtils_Data'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OTUtils.mdf'',
MOVE ''OTUtils_Log'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\OTUtils_log.ldf'', REPLACE'
)
ALTER DATABASE OTUtils SET RECOVERY FULL
IF NOT EXISTS (SELECT 1 FROM sysdatabases WHERE name = 'Security')
CREATE DATABASE Security
ALTER DATABASE Security SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE Security SET MULTI_USER
SELECT @DBtoRestore = DBName FROM #DBs WHERE DBName LIKE 'Security%'
EXEC(
'RESTORE DATABASE Security 
FROM  DISK = ''Z:\Etalon_backups\'+@DBtoRestore+'''
WITH  MOVE ''Security_Data'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\Security.mdf'',
MOVE ''Security_Log'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\Security_log.ldf'''
)
ALTER DATABASE Security SET RECOVERY FULL
IF NOT EXISTS (SELECT 1 FROM sysdatabases WHERE name = 'UserLog')
CREATE DATABASE UserLog
ALTER DATABASE UserLog SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE UserLog SET MULTI_USER
SELECT @DBtoRestore = DBName FROM #DBs WHERE DBName LIKE 'UserLog%'
EXEC(
'RESTORE DATABASE UserLog 
FROM  DISK = ''Z:\Etalon_backups\'+@DBtoRestore+'''
WITH  MOVE ''UserLog'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\UserLog.mdf'',
MOVE ''UserLog_Log'' TO ''D:\MSSQL13.MSSQLSERVER\MSSQL\DATA\UserLog_log.ldf'''
)
ALTER DATABASE UserLog SET RECOVERY FULL


Банальное восстановление баз данных,
я так понимаю , что sql cmd просто не понимает параметров этих, возможно необходимо использовать
Invoke-Sqlcmd -InputFile "C:\Temp\analit.sql"

кто сталкивался с работой через PS можете помочь как правильно поступить в данном случае!?

Сообщение было отредактировано: 17 ноя 17, 20:19
17 ноя 17, 19:49    [20964838]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
REMBO,

ошибку то оно вам какую выдает? вы используете DataReader хотя не возвращаете в резалтсет ничего. запускайте $SqlCmd.ExecuteNonQuery
17 ноя 17, 20:17    [20964895]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
felix_ff
REMBO,
ошибку то оно вам какую выдает?

Ошибок нет в том то и дело, просто прогнал и остановился PS
я вот начал тестить такой режим

+
$skript1='C:\Temp\analit.sql'
$skript2='C:\Temp\kassa.sql'
$SqlServer = ".";
$SqlServer2 = ".\KASSA";
$SqlCatalog = "master";
$SqlLogin = "sa";
$SqlPassw = "654321"
$SqlPassw2= "123456"
Invoke-Sqlcmd -ServerInstance $SqlServer -Database $SqlCatalog -Username $SqlLogin -Password $SqlPassw -InputFile $skript1 | Out-File -filePath "C:\Temp\analit.log"


Вроде смотрю начинает жесткий диск подгружать, как будто восстанавливает бэкапы
но через время , секунд 30
выдает вот что:

Invoke-Sqlcmd : Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
At line:9 char:1
+ Invoke-Sqlcmd -ServerInstance $SqlServer -Database $SqlCatalog -Usern ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
 
17 ноя 17, 22:05    [20965049]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
Col
Member

Откуда: Торонто
Сообщений: 177
REMBO
Попробуйте к gc ($PATH) добавить
| Out-String

что бы получилось
gc ($PATH)| Out-String

Но после мучений с ExecuteReader только Invoke-Sqlcmd, работает как двуручная пила, просто и понятно.
Вот что я когда-то навалял, у меня доменная авторизация, засим без юзер/пароль.
Разультаты сохраняет в цсв в папке results (нужно заранее создать ее)

 
#Path to the SQL script 
$query = Get-Content ".\Script.sql"
 
#Path to the CSV file to be saved.
 
foreach ($f in Get-ChildItem -path ".\" -Filter *.sql | sort-object -desc ) 
{ 
$csvFilePath = ".\results\" + $f.name.split(".")[0] + ".csv" ;


 
# Run Query against multiple servers, combine results
# Replace "Server1", "Server2\INSTANCE1" with names of your SQL Server instances
# Set servernames here, one per line
 
$instanceNameList = get-content .\serverlist.txt
 $results=@()
  
foreach($instanceName in $instanceNameList)
{
        write-host "Executing query against server: " $instanceName
        $results += Invoke-Sqlcmd -InputFile $f.fullname -ServerInstance $instanceName
}
 
# Output to CSV
 
write-host "Saving Query Results in CSV format..."
$results | export-csv  $csvFilePath   -NoTypeInformation



##foreach ($f in Get-ChildItem -path ".\" -Filter *.sql | sort-object -desc ) 
 
##invoke-sqlcmd -InputFile $f.fullname | format-table | out-file -filePath $out 
}
17 ноя 17, 23:06    [20965169]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
REMBO,

для командлета Invoke-sqlcmd укажите параметр -QueryTimeout XXX

где XXX - количество секунд ожидания ответа от сервера, по умолчанию оно 30 секунд у Вас видимо весь скрипт занимает большее время выполнения.
18 ноя 17, 00:21    [20965271]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
человек_ниоткуда
Guest
REMBO
Доброго времени суток
помогите разобраться , я пытаюсь попросить PS чтоб он мне выполнил на 2х инстансах определенне скрипты в файлах

А привет. Вообще mssql management studio так умеет.
Мож тебе проще будет через sqlcmd это сделать?

Поправил тебе скрипт.
+
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlCatalog = "master"; # не нужно это - ты ж в строке соединения указываешь базу.
$SqlLogin = "sa";
$arrayofDATA=@(
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\analit.sql'
SERVER="."
Pass="123456"
}),
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\kassa.sql'
SERVER=".\KASSA"
Pass="654321"
}))
 
foreach($data in $arrayofDATA)
{
    $SERV=$data.Server
    $PATH=$data.PATH
    $Pass=$data.Pass
    $SqlConnection.ConnectionString = "Server=$SERV; Database=$SqlCatalog; User ID=$SqlLogin; Password=$Pass;"
    $SqlConnection.Open()
    $SqlCmd = $SqlConnection.CreateCommand()
    $SqlConnection.CommandTimeout = 0; #форева (а по умолчанию не то 10 не то 30 секунд.
    $SqlCmd.CommandText = [IO.File]::ReadAllText($PATH) ; # ну как-то попроще, хотя и требует absolute path
    $objReader = $SqlCmd.ExecuteReader()
    # Вот ты читаешь результат ПЕРВОГО SELECT-а. А результат второго надо NextResult вызвать.
    # Вот как-то так:
    while ($objReader.HasRows())
{

    while ($objReader.read()) {
    echo $objReader.GetValue(0)
}
$objReader.NextResult();    
}
    $objReader.close()
    $SqlConnection.Close()
}


REMBO
кто сталкивался с работой через PS можете помочь как правильно поступить в данном случае!?

с твоим уровнем ps и задачами твоими - проще сформировать параметры для sqlcmd.exe и сделать через него.
sqlcmd.exe -S $SERV -d $SqlCatalog -U $SqlLogin -P $Pass -i $PATH ; 
18 ноя 17, 02:18    [20965351]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
человек_ниоткуда
А привет. Вообще mssql management studio так умеет.
Мож тебе проще будет через sqlcmd это сделать?
Поправил тебе скрипт.


спасибо огромное , вроде все гладко кроме одной ошибочки
+

The property 'CommandTimeout' cannot be found on this object. Verify that the property exists and can be set.
At line:24 char:5
+ $SqlConnection.CommandTimeout = 0;
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException


думал проблема в самой строке , попробовал изменить на QueryTimeout, ошибка выпадает такого-же рода
его че надо в foreach обернуть ?
Спасибо
20 ноя 17, 12:49    [20968800]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
REMBO,


CommandTimeout это свойство объекта SQLCommand

соотвественно

$SqlCmd.CommandTimeout = 0;
20 ноя 17, 12:58    [20968845]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
ЕЕЕ, посибо. даа, а я то рыл искал по stackoverflow инфу, как иголку в стоге, ))
Спасибо!

Вопрос конечно остался, я проверил все работает, восстанавливает ,поправил скрипт правда по восстановлению нашел незначительную ошибку, вот, функция , я так понял которая должна возвращать мне лог визжит и ругается
это конечно не особо критично, но вот если будет вдруг битый бэкап, тогда можно и проглядеть
можно как-то доработать , чтоб он хоть какой-то лог показывал и сохранял

он в ps кстати возвращает значения, только если sql запрос выполнился с ошибками ...


+
Method invocation failed because [System.Data.SqlClient.SqlDataReader] does not contain a method named 'HasRows'.
At line:27 char:13
+ while ($objReader.HasRows())
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [System.Data.SqlClient.SqlDataReader] does not contain a method named 'HasRows'.
At line:27 char:13
+ while ($objReader.HasRows())
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
20 ноя 17, 14:08    [20969143]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
REMBO,

объект SqlDataReader не имеет метода HasRows, у него это свойство поэтому необходимо писать while ($objReader.HasRows)
20 ноя 17, 14:46    [20969283]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
felix_ff,

Да вы ,100 правы, все ваши советы помогли,
интересно спросить, у вас, когда нибудь имели опыт ,(в PS посчитать время необходимое для выполнения команды
например если идет восстановление, через менеджер процесс восстановления в процентном соотношении отображается
а что-б этот ход событий передать в PS, необходимо дополнительно использовать что-то)

например при копировании файлов через bittransfeer , я использую такого вида код, помогает визуально понимать через скоко
произойдет сие чудо ...
+

# вверху другой код...
}

$BitJobs=Import-Csv "$ScriptPath\$CSVListName" | Start-BitsTransfer -Asynchronous -Priority Normal -DisplayName CopyMyBackups

while ((Get-BitsTransfer | ? { $_.JobState -ne "Transferred" }).Count -gt 0) {
$totalbytes=0;
$bytestransferred=0;
$timeTaken = 0;
foreach ($CopyMyBackups in (Get-BitsTransfer | ? { $_.JobState -eq "Transferring" } | Sort-Object CreationTime)) {
$totalbytes += $CopyMyBackups.BytesTotal;
$bytestransferred += $CopyMyBackups.bytestransferred
if ($timeTaken -eq 0) {
#Get the time of the oldest transfer aka the one that started first
$timeTaken = ((Get-Date) - $CopyMyBackups.CreationTime).TotalMinutes
}
}
# TimeRemaining = (TotalFileSize - BytesDownloaded) * TimeElapsed/BytesDownloaded
if ($totalbytes -gt 0) {
[int]$timeLeft = ($totalBytes - $bytestransferred) * ($timeTaken / $bytestransferred)
[int]$pctComplete = $(($bytestransferred*100)/$totalbytes);
Write-Progress -Status "Transferring $bytestransferred of $totalbytes ($pctComplete%). $timeLeft minutes remaining." -Activity "Dowloading files" -PercentComplete $pctComplete
Start-Sleep 10
}
}


в принципе , это все-го лишь вопрос, мне просто интересно если функция такая есть то я б попробовал бы ее реализовать.
20 ноя 17, 15:11    [20969384]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4534
REMBO,
+
You are here: Home >> Posts >> Powershell >> Capturing InfoMessage Output (PRINT, RAISERROR) from SQL Server using PowerShell
Capturing InfoMessage Output (PRINT, RAISERROR) from SQL Server using PowerShell
+ How to monitor backup and restore progress in SQL Server

20 ноя 17, 15:48    [20969549]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
REMBO,

То что вы хотите впринципе реализуемо, необходимо подписаться на событие объекта соединения

так бы было на c#
SqlConnection cn= new SqlConnection(ConnectionString);
cn.InfoMessage += (object obj, SqlInfoMessageEventArgs e)=>{e.Message.Dump(); };


а в PS что то типа такого:
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message };
$SqlConnection.add_InfoMessage($handler);
$SqlConnection.FireInfoMessageEventOnUserErrors = $true;


смысл в том что вы подписываетесь на событие InfoMessage объекта соединения, оно отлавливает все PRINT сообщения в коннекте, поскольку стандартная инструкция RESTORE возвращает в виде print-сообщений процент готовности бэкапа, оно будет транслироваться вам с оболочку.

можно еще посмотреть решения с Register-ObjectEvent командлетом.
или еще вариант ручная обработка в виде двух потоков в первом вы запускаете восстановление БД, во втором с какой то периодичностью ломитесь в другом соединении на сервер и смотрите во вьюху sys.dm_exec_requests по тому session_id которая восстанавливает БД, запрашивая столбец percent_complete
20 ноя 17, 16:16    [20969683]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
felix_ff
То что вы хотите впринципе реализуемо,


С наступившем) , Привет добрались руки до реализации плана , отображения прогресса восстановления
Покопался в инете почитал предыдущие подсказки
и вот на что я наткнулся

Интересный , ниже скрипт , реализует восстановление с прогрессом, я лишь прошу помощи как реализовать
рабочий вариант и добавить кусок который бы помог в осуществлении плана

+
<#
  sqlps dependency
  If module sqlps does not exist, install from:
    Microsoft SQL Server 2016 Feature Pack (https://www.microsoft.com/en-us/download/details.aspx?id=52676)
    - SQLSysClrTypes.msi
    - SharedManagementObjects.msi
    - PowershellTools.msi
#>

param(
  [Parameter(Mandatory=$true,Position=0)]
  [string]$servername,
  [Parameter(Mandatory=$true,Position=1)]
  [string]$dbname,
  [Parameter(Mandatory=$true,Position=2)]
  [string]$filename)



Push-Location
Import-Module "sqlps" -DisableNameChecking
Pop-Location

<#
  MAIN
#>

$server = New-Object Microsoft.SqlServer.Management.Smo.Server $servername
$restore = New-Object Microsoft.SqlServer.Management.Smo.Restore
$device = New-Object Microsoft.SqlServer.Management.Smo.BackupDeviceItem $filename, "FILE"
$restore.Devices.Add($device)
try {
  $filelist = $restore.ReadFileList($server)
}
catch {
	$exception = $_.Exception
	Write-Host "$exception. `n`nDoes the SQL Server service account have acccess to the backup location?" -ForegroundColor Red
  exit 1
}

$filestructure = @{}; $datastructure = @{}; $logstructure = @{}
$logfiles = $filelist | Where-Object {$_.Type -eq "L"}
$datafiles = $filelist | Where-Object {$_.Type -ne "L"}

# Data Files (if db has filestreams, make sure server has them enabled)
$defaultdata = $server.DefaultFile
$defaultlog = $server.DefaultLog
if ($defaultdata.Length -eq 0) {
    $defaultdata = $server.Information.MasterDBPath
}

if ($defaultlog.Length -eq 0) {
    $defaultlog = $server.Information.MasterDBLogPath
}

foreach ($file in $datafiles) {
	$newfilename = Split-Path $($file.PhysicalName) -leaf

	$datastructure.physical = "$defaultdata$newfilename"
	$datastructure.logical = $file.LogicalName
	$filestructure.add($file.LogicalName,$datastructure)
}

# Log Files
foreach ($file in $logfiles) {
	$newfilename = Split-Path $($file.PhysicalName) -leaf

	$logstructure.physical = "$defaultlog$newfilename"
	$logstructure.logical = $file.LogicalName
	$filestructure.add($file.LogicalName,$logstructure)
}

# Make sure big restores don't timeout
$server.ConnectionContext.StatementTimeout = 0

foreach	($file in $filestructure.values) {
	$movefile = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile"
	$movefile.LogicalFileName = $file.logical
	$movefile.PhysicalFileName = $file.physical
	$null = $restore.RelocateFiles.Add($movefile)
}

Write-Host "Restoring $dbname to $servername" -ForegroundColor Yellow

# kill all connections
$server.KillAllProcesses($dbname)

try {

	$percent = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] {
		Write-Progress -id 1 -activity "Restoring $dbname to $servername" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent))
	}
	$restore.add_PercentComplete($percent)
	$restore.PercentCompleteNotification = 1
	$restore.add_Complete($complete)
	$restore.ReplaceDatabase = $true
	$restore.Database = $dbname
	$restore.Action = "Database"
	$restore.NoRecovery = $false

  # take most recent backup set if there are more than one
  $restore.FileNumber = $restore.ReadBackupHeader($server).Rows.Count

	Write-Progress -id 1 -activity "Restoring $dbname to $servername" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0))
	$restore.sqlrestore($servername)
	Write-Progress -id 1 -activity "Restoring $dbname to $servername" -status "Complete" -Completed

	Write-Host "Restore complete!" -ForegroundColor Green

  exit 0
}
catch {
	$exception = $_.Exception.InnerException
  Write-Host $exception -ForegroundColor Red
  exit 1
}


Данный скриптецкий нашел на Гитхабе

Но как вы видите он использует не обращения к скриптам а встроенную функцию

На данный момент С вашей помошью, рабочий вариант выглядит так :

+
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlCatalog = "master";
$SqlLogin = "sa";
$arrayofDATA=@(
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\analit.sql'
SERVER="."
Pass="321"
}),
$(New-Object PSOBJECT -Property @{
PATH='C:\Temp\kassa.sql'
SERVER=".\KASSA"
Pass="123"
}))

foreach($data in $arrayofDATA)
{
    $SERV=$data.Server
    $PATH=$data.PATH
    $Pass=$data.Pass
    $SqlConnection.ConnectionString = "Server=$SERV; Database=$SqlCatalog; User ID=$SqlLogin; Password=$Pass;"
    $SqlConnection.Open()
    $SqlCmd = $SqlConnection.CreateCommand()
    $SqlCmd.CommandTimeout = 0;
    $SqlCmd.CommandText = [IO.File]::ReadAllText($PATH) ;
    $objReader = $SqlCmd.ExecuteReader()
    while ($objReader.HasRows)
{

    while ($objReader.read()) {
    echo $objReader.GetValue(0)
}
$objReader.NextResult();    
}
    $objReader.close()
    $SqlConnection.Close()
}


Буду благодарен за любую помощь в реализации данной задумки..
30 янв 18, 18:34    [21152239]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
REMBO
Буду благодарен за любую помощь в реализации данной задумки..
Зарплатой поделитесь?
31 янв 18, 00:53    [21152900]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
Mind
REMBO
Буду благодарен за любую помощь в реализации данной задумки..
Зарплатой поделитесь?


Могу при встрече Пивасом угостить, а если по сущетву. то это личное, хотел сделать для себя , для лучшей визуализации происходящего..
31 янв 18, 15:13    [21154600]     Ответить | Цитировать Сообщить модератору
 Re: powershell + sql2016 помогите разобраться  [new]
REMBO
Member

Откуда:
Сообщений: 13
Прошу хотя бы подсказать какое решение выбрать

Я так думаю что сам процесс восстановления нужно организовать. другим методом
т.к. в текущем рабочем методе как писали ранее только если я подпишусь на обработчик события, возможно что-то на выходе и получу
31 янв 18, 21:46    [21155784]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить