为什么我无法连接到SQL Server 2012 LocalDB共享实例?

时间:2012-04-18 17:28:06

标签: sql-server sql-server-express sql-server-2012 localdb sql-server-2012-express

我正在尝试在Windows 7 x64计算机上设置SQL Server 2012 LocalDB(RTM,x64)共享实例,而我似乎无法连接到共享实例。我正在使用管理员命令提示符进行所有设置。这是我创建实例的方式:

sqllocaldb create MyInstance

产生回应:

LocalDB instance "MyInstance" created with version 11.0.

到目前为止一切顺利。现在我分享实例:

sqllocaldb share "MyInstance" "MySharedInstance"

结果是:

Private LocalDB instance "MyInstance" shared with the shared name: "MySharedInstance".

看起来还不错。此时,我的info命令产生:

.\MySharedInstance
MyInstance
v11.0

使用管理员或非管理员命令提示符从所有者帐户(管理员)连接到实例似乎工作正常。但是,当我以普通用户(不是Windows管理员)身份登录并尝试连接时,事情就会出现问题:

sqlcmd -S (localdb)\.\MySharedInstance

结果:

Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Named Pipes Provider: Could not open a connection to SQL Server [2]. .
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login timeout expired.
Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

使用“-l”开关增加登录超时没有用。我可以连接到默认的v11.0实例,该实例不是共享的。非管理员用户的info命令产生与上面相同的内容,除非没有“MyInstance”,因为它是admin用户拥有的命名实例。以下命令(适用于admin用户/实例所有者):

sqllocaldb info ".\MySharedInstance"

也会导致错误:

Windows API call "FileTimeToSystemTime" returned error code: -2147024809.

所以问题是为什么我的非管理员用户不能连接到我的共享实例?这似乎打败了共享实例的整个目的。当我尝试查询共享实例时,“sqllocaldb info”命令引发错误是什么?

5 个答案:

答案 0 :(得分:23)

另一个编辑

Cory,如果您安装了以前版本的SQL Server(例如2008),那就是您正在使用的sqlcmd版本。要连接到LocalDb,您需要使用SQL Server 2012版本的sqlcmd。因此,您对用户的指示必须通过运行以下命令确保他们使用SQL Server 2012版本:

C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd -S "(localdb)\.\InstanceName"

这对我有用。我尚未验证的是sqlcmd的路径和版本是否仅适用于 安装了sqllocaldb.msi的用户。抱歉,我没有安装SQL Server 2012的裸机(或者只安装了以前的版本)来彻底尝试这一点。但是,如果明确地调用110版本的sqlcmd可以解决问题,请告诉我。

我认为你也可以指示用户改变他们的系统变量,以便首先出现110个版本(自动恕我直播)。

Krzysztof的一位同事已经确认FileTimeToSystemTime是一个错误。因此,对于非所有者通过sqllocaldb进行连接,我仍然无法解决问题。但是我已经证明SSMS和sqlcmd都可以工作,所以我希望能让你更接近跑步。

编辑

您需要向实例添加任何非所有者用户,例如CREATE LOGIN [MyDomain\OtherUser] FROM WINDOWS;以及任何适当的权限。在我的测试登录失败并生成错误的错误消息(“FileTimeToSystemTime”错误消息是一个错误)。您还需要GRANT CONNECT。执行此操作后,您能够使用Management Studio通过此连接从第二个用户进行连接(我尝试过的唯一用户):

(localdb)\.\MySharedInstance

但是从sqlcmd开始,无论我如何尝试连接,我仍然会收到错误:

sqlcmd -S "(localdb)\.\MySharedInstance"
sqlcmd -S ".\MySharedInstance"
sqlcmd -S "(localdb)\MySharedInstance"
sqlcmd -S "GREENHORNET\MySharedInstance"
sqlcmd -S ".\LOCALDB#SH04FF8A"
sqlcmd -S "GREENHORNET\LOCALDB#SH04FF8A"

所有收益:

  

HResult 0xFFFFFFFF,级别16,状态1 SQL Server网络接口:

     

错误查找指定的服务器/实例[xFFFFFFFF]。

     

Sqlcmd:错误:   Microsoft SQL Server Native Client 10.0:与网络相关或   建立连接时发生了特定于实例的错误   到SQL Server。找不到服务器或无法访问服务器。检查是否   实例名称是正确的,如果SQL Server配置为允许   远程连接。有关详细信息,请参阅SQL Server联机丛书..

     

Sqlcmd:错误:Microsoft SQL Server Native Client 10.0:登录超时   过期。

虽然我已经验证实例已设置为接受远程连接。所以sqlcmd还必须经历一些其他的箍。

关于sqllocaldb exe,这是如何遵循任何逻辑的?我可以通过info看到实例在那里,当我试图阻止它时,我得到一个正确的错误消息,当我尝试启动它时,我收到一条消息,它已经[已经]启动了,但我不能连接到它?

enter image description here

因此,除非您需要 sqlcmd访问权限,否则短期内我会让次要用户使用SSMS(一旦您授予了足够的权限),并希望Krzysztof将拥有有关其他项目的更多信息。


关于4.0.2更新,来​​自http://connect.microsoft.com/SQLServer/feedback/details/723737/smo-cant-connect-to-localdb-instances

  

我们明确决定不包含.NET Framework 4.0.2   LocalDB安装程序。安装.NET Framework更新会增加   LocalDB安装程序的大小并导致可能的重新启动。以来   LocalDB是独立于.NET而构建的,我们认为不是   应该为每个LocalDB安装花费这个成本。未来的.NET   版本(包括.NET 4.5,现在在CTP中)将支持LocalDB   盒子。一些开发人员可能也想选择使用ODBC,PHP   驱动程序/ PDO,将来可能是JDBC。那些开发人员不会   有兴趣更新.NET。

答案 1 :(得分:7)

正如原帖所说,这并不像预期的那样直截了当,但我最终能够通过命名管道进行连接。

Connecting to a LocalDB instance via named pipe

答案 2 :(得分:1)

这些答案表示删除实例是正确的。
即:你的所有数据都将消失,这是可以的。

升级我的SSMS后,我遇到了同样的问题。

sqllocaldb i
.\MyCustomInstance

sqllocaldb d
LocalDb instance ".\MyCustomInstance" does not exist!

sqllocaldb i .\MyCustomInstance
Windows API call "FileTimeToSystemTime" returned error code: -2147024809.

为了摆脱有问题的实例,我必须创建另一个MyCustomInstance,我想这将覆盖已经存在的内容,现在你可以将其删除

sqllocaldb c MyCustomInstance
LocalDB instance "MyCustomInstance" created with version 11.0.
sqllocaldb d .\MyCustomInstance
LocalDB instance ".\Octopus" deleted.

然后,启动实例并共享它。 迫切需要先启动实例。

sqllocaldb s MyCustomInstance
LocalDB instance "MyCustomInstance" started.
sqllocaldb h MyCustomInstance MyCustomInstance
Private LocalDB instance "MyCustomInstance" shared with the shared name: "MyCustomInstance".

现在,当您需要连接时,可以使用(localdb)\.\MyCustomInstance

进行连接

答案 3 :(得分:0)

安装完整的.NET Framework 4.5.2或更高版本,然后重新启动,然后应该可以使用以下方式进行连接:

sqlcmd -S (localdb)\.\MySharedInstance

我发现重新引导计算机时,命名管道会生成新的哈希,重新启动后,命名共享实例将继续存在。

重要的是,直到重新启动后,它才起作用。

答案 4 :(得分:-4)

问题是您需要引用数据库名称:

sqlcmd -S "(localdb)\.\MySharedInstance"
相关问题