如何在不启用命名管道的情况下使用invoke-sqlcmd?

时间:2013-05-17 16:37:14

标签: sql-server powershell

我正在使用加载以下SQL Server 2008 R2 powershell插件的脚本

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
然后我按照这样的方式调用-sql:

Invoke-Sqlcmd -Query "select * from table" -ServerInstance xyz -Database abc -username xxxxxx -password yyyyyyy

我正在使用方法在我们的数据库上运行许多升级脚本。我很高兴在我们的dev \ test环境中使用它,但后来我在生产中尝试了它,结果发现我们在服务器配置上有所不同。在我们的prod服务器上,由于安全原因(显然是蠕虫攻击)而禁用了命名管道,而我们的DBA不想启用。

这是我得到的错误,研究表明这是一个命名管道问题 - 当我启用它们时开始工作。

  

INFO ERROR:Invoke-Sqlcmd:连接成功   与服务器建立,但在此期间发生错误   登录过程。 (提供者:共享内存提供者,错误:0 - 否   进程位于管道的另一端。)

有没有人知道是否有某种方法可以切换我的脚本以便它不需要命名管道?或者这是invoke-sqlcmd的内置连接方法,我需要更改大头钉(如果有任何建议)。

3 个答案:

答案 0 :(得分:1)

这是一个有根据的猜测。但是这里有:

我认为您必须使用注册表“覆盖默认值”。

http://support.microsoft.com/kb/229929

现在,最简单的方法(IIRC)就是通过你的

Control Panel / ODBC Data Source / System DSN.

添加“Sql Server”。 (不是原生客户端)。

最重要的按钮是“客户端配置”,您可以在其中选择命名管道或tcp / ip 试用DSN方法,完成向导后,查看

下的注册表项
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Client\ConnectTo

.........

你可以查看一下:

http://sev17.com/2012/11/05/cloning-sql-servers-to-a-test-environment/

查找此代码。

sqlcmd -S myCMServerInstance -d msdb -Q $query -h -1 -W |
foreach { Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftMSSQLServerClientConnectTo' -Name $($_ -replace 'TEST') -Value "DBMSSOCN,$_" }

}

答案 1 :(得分:1)

与Surreal对使用LPC(本地共享内存)的响应类似,对于TCP / IP而不是命名管道,您还可以指定-ServerInstance tcp:foodb

答案 2 :(得分:0)

您可以使用前缀将连接方法更改为实例名称as for sqlcmd。使用SQL Server 2012和Powershell 4,这对我有用:

Invoke-Sqlcmd -Query $sqlQuery -serverinstance "lpc:localhost" -Database "myDatabase"