5

我正在使用加载以下 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

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

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

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

有谁知道是否有某种方法可以切换我的脚本以使其不需要命名管道?或者这是invoke-sqlcmd的内置连接方法,我需要改变策略(如果有的话)。

4

3 回答 3

2

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

于 2016-01-11T19:46:33.793 回答
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,$_" }

}
于 2013-05-17T17:33:12.663 回答
1

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

Invoke-Sqlcmd -Query $sqlQuery -serverinstance "lpc:localhost" -Database "myDatabase"
于 2015-08-09T20:10:30.867 回答