【问题标题】:How to run Invoke-Sqlcmd in PowerShell script from Tidal如何在 Tidal 的 PowerShell 脚本中运行 Invoke-Sqlcmd
【发布时间】:2016-06-28 17:03:10
【问题描述】:

我有一个 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 用户帐户远程访问文件共享服务器时,脚本成功执行并按预期执行。

我有一个相应的 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-Host cmdlet,但无法识别 Invoke-Sqlcmd cmdlet。怎么会这样?而且,我该如何解决这个问题? (我发现 Tidal 用户是 NT AUTHORITY\SYSTEM,而不是作业的 Run 选项卡中指定的 Runtime User,与我登录远程服务器时的 Tidal 用户相同。)

【问题讨论】:

  • SQL 模块未加载到 SYSTEM 的 PowerShell 配置文件中。见jasonq.com/blog/2012/…。您可能需要将任务设置为使用用户帐户运行,因为我认为它以 SYSTEM 身份运行时可能无法访问网络。
  • 我认为你是对的。我使用另一个用户帐户使用 New-PSSession 创建了一个新的 PowerShell 会话,它可以工作。

标签: powershell tidal-scheduler


【解决方案1】:

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

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

# For SQL 2012
Import-Module SqlPs

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

【讨论】:

  • 注意Import-Module SQLPS; 将当前工作目录更改为SQLSERVER:`, the SQL Server provider. And, unless you specify Import-Module SQLPS -DisableNameChecking`,然后 Import-Module 将发出警告,因为 SQL Server 开发人员选择了非标准动词。据说这些都是 SQL Server 2016 修复的,但我还没有检查过自己。
猜你喜欢
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
相关资源
最近更新 更多