Почему я не могу подключиться к общедоступному экземпляру SQL Server 2012 LocalDB?
Я пытаюсь настроить общий экземпляр SQL Server 2012 LocalDB (RTM, x64) на моем компьютере с Windows 7 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 ответа
ДРУГОЕ РЕДАКТИРОВАНИЕ
Кори, если у вас установлены предыдущие версии 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 (что, IMHO, должно иметь место автоматически).
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 10.0: при установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или недоступен. Проверьте, правильно ли указано имя экземпляра и настроен ли SQL Server для разрешения удаленных подключений. Дополнительные сведения см. В электронной документации по SQL Server.
Sqlcmd: ошибка: собственный клиент Microsoft SQL Server 10.0: истекло время ожидания входа.
Хотя я убедился, что экземпляр настроен на прием удаленных подключений. Так что есть еще один обруч, который sqlcmd
должно быть переживает.
И относительно sqllocaldb
Отлично, как это следует какой-либо логике? Я могу видеть, что экземпляр там через info
, Я получаю правильное сообщение об ошибке, когда я пытаюсь остановить его, я получаю сообщение, что он [уже] запущен, когда я пытаюсь запустить его, но я не могу подключиться к нему?
Так что если вам не нужно sqlcmd
доступ, в краткосрочной перспективе я хотел бы, чтобы вторичные пользователи делали свое дело с SSMS (как только вы предоставили соответствующие разрешения), и, надеюсь, у Кшиштофа будет больше информации по другим пунктам.
Что касается обновления 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 Driver/PDO и, возможно, JDBC. Эти разработчики не будут заинтересованы в обновлении.NET.
Как и предполагалось в оригинальном сообщении, это было не так просто, как ожидалось, но в итоге я смог подключиться через именованный канал.
ЭТОТ ОТВЕТ ПРЕДЛАГАЕТ УДАЛИТЬ ИНСТАНЦИЮ.
то есть: все ваши данные исчезнут, и это нормально.
У меня была такая же проблема после обновления моей 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
Установите полную версию.NET Framework 4.5.2 или новее, затем перезагрузитесь, после этого вы сможете подключиться, используя:
sqlcmd -S (localdb)\.\MySharedInstance
Я обнаружил, что именованные каналы генерируют новый хеш при перезагрузке машины, именованный общий экземпляр сохраняется после перезагрузки.
Важно отметить, что это не сработает до перезагрузки.
Проблема в том, что вам нужно указать имя БД:
sqlcmd -S "(localdb)\.\MySharedInstance"