我有一个PowerShell脚本(test.ps1),它通过Invoke-Sqlcmd执行一个简单的SQL查询。该脚本位于远程文件共享服务器上。以下是剧本:
param
(
[string]$SQL_username,
[string]$SQL_password
)
Write-Host ('begin script')
$db = 'some_DB'
$server = 'some_IP'
$query = 'SELECT TOP 10 * FROM some_schema.some_table'
Invoke-Sqlcmd -Username $SQL_username -Password $SQL_password -ServerInstance $server -Database $db -Query $query -QueryTimeout 60000
Write-Host ('end script')
当我使用潮汐用户帐户远程访问文件共享服务器时,脚本会按预期成功执行。
我有一个相应的Tidal作业执行这个test.ps1脚本。这是潮汐工作信息:
命令
C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe
命令参数
-ExecutionPolicy bypass -File D:\some_path\test.ps1
-SQL_username "<SQL_username.1>"
-SQL_password "<SQL_password.2>"
当我通过Tidal运行脚本时,Tidal的输出屏幕显示:
开始脚本
Invoke-Sqlcmd:术语&#39; Invoke-Sqlcmd&#39;不被识别为名称 cmdlet,函数,脚本文件或可操作程序...
结束脚本
因此,很清楚无论用户Tidal使用什么来运行脚本,用户都会识别Write-Host
cmdlet,但它无法识别Invoke-Sqlcmd
cmdlet。怎么会这样?而且,我该如何解决这个问题呢? (我发现潮汐用户是NT AUTHORITY \ SYSTEM,而不是作业的“运行”选项卡中指定的运行时用户,这与我登录到远程服务器的潮汐用户相同。)
答案 0 :(得分:1)
SQL模块未加载到SYSTEM的PowerShell配置文件中。在任何invoke-sqlcmd
语句之前,您需要运行类似于以下内容的内容:
# For SQL 2008
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
# For SQL 2012
Import-Module SqlPs
您可能还需要将任务设置为使用用户帐户运行,因为它在以SYSTEM身份运行时将无法访问网络。