Сценарий Powershell, использующий команду Invoke-SQL, необходимую для задания SQL, версия Powershell для SQL Server несколько ограничена, есть ли обходной путь?
Полный вопрос: есть ли в Powershell Script команда Invoke SQL, использующая snappins, мне нужно, чтобы они были включены в задание SQL, версия Powershell для SQL Server несколько урезана, кто-нибудь знает обходной путь?
Исходя из того, что я понял, версия powershell в SQL Management Studio недостаточно мощная, не позволяющая использовать snappins, так как она не распознает командлеты, которые я использовал в сценарии. Я попытался запустить его в задании в виде приглашения командной строки, а не сценария Powershell, что заставляет код работать в некоторой степени, однако я проверяю историю задания и сообщаю, что invoke-sql по-прежнему не является распознанным командлетом. Я предполагаю, что из-за того, что я запускаю код на удаленном сервере с другими учетными данными, отличными от моего стандарта, мой профиль с предварительно загруженными snappins не загружается, хотя это несколько сомнительно.
Кроме того, поскольку я новичок PowerShell, любые советы по улучшению практики кодирования / оптимизации моего кода будут высоко оценены!
Код выглядит следующим образом:
# define parameters
param
(
$file = "\\server\folder\file.ps1"
)
"invoke-sqlcmd -query """ | out-file "\\server\folder\file.ps1"
# retrieve set of table objects
$path = invoke-sqlcmd -query "select TableName from table WITH (NoLock)" -database db -server server
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$so = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions
$so.DriPrimaryKey = $false
$so.Nocollation = $true
$so.IncludeIfNotExists = $true
$so.NoIdentities = $true
$so.AnsiPadding = $false
# script each table
foreach ($table in $path)
{
#$holder = $table
$table = get-item sqlserver:\sql\server\default\databases\database\tables\dbo.$($table.TableName)
$table.script($so) | out-file -append $file
}
(get-content "\\server\folder\file.ps1") -notmatch "ANSI_NULLS" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -notmatch " AS "| out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -notmatch "Quoted_" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\) ON \[PRIMARY\].*", ")" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "\[text\]", "[nvarchar](max)" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace " SPARSE ", "" | out-file "\\server\folder\file.ps1"
(get-content "\\server\folder\file.ps1") -replace "COLUMN_SET FOR ALL_SPARSE_COLUMNS", "" | out-file "\\server\folder\file.ps1"
""" -database database -server server" | out-file "\\server\folder\file.ps1" -append
3 ответа
Поэтому я разобрался с ответом на свой вопрос. Используя этот сайт: http://www.mssqltips.com/tip.asp?tip=1684 и http://www.mssqltips.com/tip.asp?tip=1199
Я выяснил, что он мог сделать это с помощью прокси-сервера агента SQL Server, поэтому я пошел по дороге из желтого кирпича, и в основном я настроил прокси для своей учетной записи и смог использовать внешний PowerShell через функцию. Примечание: вам нужно создать учетные данные на вкладке ценных бумаг в проводнике объектов, прежде чем вы сможете выбрать их при создании прокси. По сути, я закончил тем, что создал прокси с именем powershell, используя подсистему powershell, и использовал мою регистрационную информацию для создания учетных данных. VOILA!
Я не уверен, что ошибка, которую вы пытаетесь обойти - вы можете опубликовать это?
Вы пробовали это из командной строки PowerShell?
Add-PSSnapin SqlServerCmdletSnapin100
Вы должны добавлять оснастки каждый раз. В вашем редакторе они, скорее всего, уже загружены из другого скрипта / вкладки / сессии. В SQL Server вам нужно добавить что-то вроде этого в начало скрипта:
IF ( (Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null )
{
Add-PsSnapin sqlserverprovidersnapin100
}
IF ( (Get-PSSnapin -Name sqlservercmdletsnapin100 -ErrorAction SilentlyContinue) -eq $null )
{
Add-PsSnapin sqlservercmdletsnapin100
}