1

我有一个 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:术语“Invoke-Sqlcmd”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称...

结束脚本

因此,很明显,无论 Tidal 使用什么用户来运行脚本,用户都能识别Write-Hostcmdlet,但无法识别Invoke-Sqlcmdcmdlet。怎么会这样?而且,我该如何解决这个问题?(我发现 Tidal 用户是 NT AUTHORITY\SYSTEM,而不是作业的 Run 选项卡中指定的 Runtime User,这与我登录远程服务器时使用的 Tidal 用户相同。)

4

1 回答 1

1

SQL 模块未加载到 SYSTEM 的 PowerShell 配置文件中。invoke-sqlcmd您需要在任何语句之前运行类似于以下内容的内容:

# For SQL 2008
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

# For SQL 2012
Import-Module SqlPs

您可能还需要将任务设置为使用用户帐户运行,因为它在以 SYSTEM 身份运行时将无法访问网络。

于 2016-06-28T18:16:07.363 回答