27

我正在尝试在我的 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”,因为它是管理员用户拥有的命名实例。以下命令(适用于管理员用户/实例所有者):

sqllocaldb info ".\MySharedInstance"

也会导致错误:

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

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

4

5 回答 5

25

另一个编辑

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"

这对我有用。我还没有验证的是,这个路径和版本是否对安装了 sqllocaldb.msi 的sqlcmd用户可用。抱歉,我没有安装任何未安装 SQL Server 2012(或仅安装以前版本)的裸机来彻底尝试这一点。但是请让我知道是否明确调用 110 版本的伎俩。sqlcmd

我认为您也可以指示用户更改他们的系统变量,以便 110 版本首先出现(恕我直言,应该自动出现这种情况)。

Krzysztof的FileTimeToSystemTime一位同事已确认这是一个错误。因此,我所知道的非所有者通过sqllocaldb. 但是我已经证明了 SSMS 和 SSMSsqlcmd都可以工作,所以我希望这能让你更接近运行。

编辑

您需要向实例添加任何非所有者用户,例如,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必须经过。

关于sqllocaldbexe,这如何遵循任何逻辑?我可以通过 看到该实例info,当我尝试停止它时收到一条正确的错误消息,当我尝试启动它时收到一条消息,它[已经] 启动,但我无法连接到它?

在此处输入图像描述

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


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

我们明确决定不在 LocalDB 安装程序中包含 .NET Framework 4.0.2。安装 .NET Framework 更新会增加 LocalDB 安装程序的大小并可能导致重新启动。由于 LocalDB 是独立于 .NET 构建的,我们认为我们不应该为每个 LocalDB 安装承担这个成本。未来的 .NET 版本(包括 .NET 4.5,现在在 CTP 中)将支持开箱即用的 LocalDB。一些开发人员可能还希望在未来选择 ODBC、PHP 驱动程序/PDO,并且可能还会选择 JDBC。这些开发人员不会对更新 .NET 感兴趣。

于 2012-04-18T18:46:00.487 回答
9

正如原始帖子所建议的那样,这并不像预期的那么简单,但我最终能够通过命名管道进行连接。

通过命名管道连接到 LocalDB 实例

于 2014-01-10T05:23:35.613 回答
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

于 2016-08-26T16:23:41.480 回答
0

安装完整的 .NET 框架 4.5.2 或更高版本,然后重新启动,您应该能够使用以下命令进行连接:

sqlcmd -S (localdb)\.\MySharedInstance

我发现命名管道在机器重启时会生成一个新的哈希,命名共享实例将在重启后持续存在。

重要的是要注意它在重新启动后才会起作用。

于 2019-07-08T14:16:40.877 回答
-4

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

sqlcmd -S "(localdb)\.\MySharedInstance"
于 2012-11-23T16:02:44.733 回答