powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / powershell + sql2016 помогите разобраться
17 сообщений из 17, страница 1 из 1
powershell + sql2016 помогите разобраться
    #39555320
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток
помогите разобраться , я пытаюсь попросить PS чтоб он мне выполнил на 2х инстансах определенне скрипты в файлах

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
$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()
}



и один из файлов который я хочу чтоб был отработан
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
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 можете помочь как правильно поступить в данном случае!?
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39555326
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO,

ошибку то оно вам какую выдает? вы используете DataReader хотя не возвращаете в резалтсет ничего. запускайте $SqlCmd.ExecuteNonQuery
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39555353
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffREMBO,
ошибку то оно вам какую выдает?
Ошибок нет в том то и дело, просто прогнал и остановился 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
выдает вот что:

Код: powershell
1.
2.
3.
4.
5.
6.
7.
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
 
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39555363
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO
Попробуйте к gc ($PATH) добавить
| Out-String

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

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

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 
#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 
}
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39555374
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO,

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

где XXX - количество секунд ожидания ответа от сервера, по умолчанию оно 30 секунд у Вас видимо весь скрипт занимает большее время выполнения.
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39555386
REMBOДоброго времени суток
помогите разобраться , я пытаюсь попросить PS чтоб он мне выполнил на 2х инстансах определенне скрипты в файлах

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

Поправил тебе скрипт.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
$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 и сделать через него.
Код: powershell
1.
sqlcmd.exe -S $SERV -d $SqlCatalog -U $SqlLogin -P $Pass -i $PATH ; 
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556093
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
человек_ниоткудаА привет. Вообще 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 обернуть ?
Спасибо
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556104
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO,


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

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

$SqlCmd.CommandTimeout = 0;
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556173
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕЕЕ, посибо. даа, а я то рыл искал по 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
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556201
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO,

объект SqlDataReader не имеет метода HasRows, у него это свойство поэтому необходимо писать while ($objReader.HasRows)
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556226
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
}
}


в принципе , это все-го лишь вопрос, мне просто интересно если функция такая есть то я б попробовал бы ее реализовать.
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556263
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39556293
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBO,

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

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



а в PS что то типа такого:
Код: sql
1.
2.
3.
$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
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39593526
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ffТо что вы хотите впринципе реализуемо,


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

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

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
<#
  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
}



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

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

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

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
$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()
}



Буду благодарен за любую помощь в реализации данной задумки..
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39593657
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REMBOБуду благодарен за любую помощь в реализации данной задумки..Зарплатой поделитесь?
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39594068
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MindREMBOБуду благодарен за любую помощь в реализации данной задумки..Зарплатой поделитесь?

Могу при встрече Пивасом угостить, а если по сущетву. то это личное, хотел сделать для себя , для лучшей визуализации происходящего..
...
Рейтинг: 0 / 0
powershell + sql2016 помогите разобраться
    #39594447
REMBO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу хотя бы подсказать какое решение выбрать

Я так думаю что сам процесс восстановления нужно организовать. другим методом
т.к. в текущем рабочем методе как писали ранее только если я подпишусь на обработчик события, возможно что-то на выходе и получу
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / powershell + sql2016 помогите разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]