【问题标题】:Invoke-SQLCMD fails on SQL ClusterSQL 集群上的 Invoke-SQLCMD 失败
【发布时间】:2016-07-28 15:37:57
【问题描述】:

我正在尝试在 SQL Server 群集上使用 invoke-sqlcmd,但它无法执行并产生以下错误:

invoke-sqlcmd : 发生与网络相关或特定于实例的错误 在建立与 SQL Server 的连接时。服务器没有 找到或无法访问。验证实例名称是否正确 并且 SQL Server 配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开 连接到 SQL Server)在 C:\rs-pkgs\SitecoreDeployScripts\SitecoreDatabasesDeploy.ps1:128 字符:1 + 调用-sqlcmd -InputFile $inputFilePath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlException + FullyQualifiedErrorId : SqlExectionError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

我能够在非集群的开发 SQL Box 上成功执行我的脚本。下面是一个 SQL 调用示例:

$scriptPath = "C:\"
$scriptName = "MyScript.sql"
$inputFilePath = "{0}\{1}" -f $scriptPath,$scriptName
invoke-sqlcmd -InputFile $inputFilePath 

所以问题是这是集群问题还是不允许远程连接的安全问题?如何让 SQL 脚本从 PowerShell 执行(如果我在 SSMS 中打开它们并按执行,则正确执行)。

【问题讨论】:

  • 我们看不到您是如何连接到 SQL Server 的。 SQLPS 模块使用 PSProvider,由于您没有在 Invoke-SqlCmd 中明确提供目标,因此它将使用 CWD。​​span>
  • 我使用的脚本的前面部分:Import-Module sqlps 有没有更好的连接方法/正确的目的地是什么?我认为 sqlps 会按原样工作,它在我的开发 SQL 框中会通过已经到位的 Windows 身份验证
  • 告诉我们当invoke-sqlcmd被执行时$pwd的值是多少。如果您没有指定 if(并且在您的示例中您没有指定),这就是用作与 SQL Server 的连接。否则,您如何期望该代码块知道您的 SQL 服务器在哪里?
  • 所以 sqlps 不允许通过登录用户的凭据?这在另一个盒子上执行得很好,所以我认为 sqlps 会通过凭据。如果不是,那么在 PowerShell 中建立连接的正确方法是什么……为什么它可以在另一台机器上工作?
  • 我的意思是,如果未指定连接信息,您使用的 cmdlet 将使用当前工作目录 (CWD) 来确定要连接到哪个 SQL 服务器。您遇到了连接问题。但是您的代码没有显示您尝试连接的位置。我们看不到您的 CWD 的价值。因此,向我们展示值,或者确定值是什么,看看它是否正确。

标签: sql-server powershell


【解决方案1】:

最后脚本只需要-ServerInstance的Server Instance名称切换如下:

$scriptPath = "C:\"
$scriptName = "MyScript.sql"
$inputFilePath = "{0}\{1}" -f $scriptPath,$scriptName
invoke-sqlcmd -InputFile $inputFilePath -ServerInstance 'MyClusterName"

我通过运行以下查询找到了该名称:

select @@servername

它可以在没有 -ServerInstance 开关的单个盒子上工作,因为它是本地化/单一的

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2015-06-16
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2018-07-15
    • 2015-11-06
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多