Включение удаленных подключений tcpip к уже установленной базе данных sql server express с кодом или сценарием (запрос)
Я развертываю sql express с моим приложением. Я хотел бы, чтобы этот компонент database engine принимал удаленные подключения. Я знаю, как настроить это руководство, запустив диспетчер конфигурации sql server, включив tcp/ip-соединения, указав порты и т. д.. Мне интересно, можно ли будет сделать то же самое из командной строки.
или, возможно, мне придется создать "проект сервера SQL Server 2008" в visual studio.
изменить 1
я разместил тот же вопрос здесь, но я хотел бы сделать то же самое на экземпляре sql express, который уже установлен. взгляните на вопрос здесь
Изменить 2
я нашел эти ссылки, которые утверждают, что делать что-то подобное и я все еще не могу заставить его работать.
1) http://support.microsoft.com/kb/839980
4) http://datazulu.com/blog/post/Enable_sql_server_tcp_via_script.aspx
правка 3
как заявил Кшиштоф в своем ответе, мне нужно (плюс другие вещи, которые я знайте, что требуются)
1-включить TCP / IP
мне удалось сделать это при установке нового экземпляра SQLExpress, передающего параметр /TCPENABLED=1
. Когда я устанавливаю sql express, как в . этот экземпляр sql express будет иметь TCP/IP включен
2-Откройте правильные порты в брандмауэре
(Я сделал это вручную, но я верю, я смогу выясните, как это сделать с помощью c#) До сих пор я должен играть вслух с этой консольной командой:
netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT
3-Изменить свойства TCP / IP включить IP-адрес
Я не смог понять, как включить IP, изменить порт и т. д.. я думаю, что это будет шаг более сложным для решения
4-включить проверку подлинности в смешанном режиме в sql сервер
мне удалось сделать это при установке SQL Express, передавая параметр /SECURITYMODE=SQL
перейдите к шагу 1 по ссылке.
SQL Server express требует, чтобы этот тип проверки подлинности принимал удаленные подключения.
5-изменить пользователя (sa) по умолчанию passowrd
по умолчанию учетная запись sa имеет значение null passowrd. Для того, чтобы принимать соединения, этот пользователь должен иметь пароль. Я изменил значение по умолчанию passowrd из sa со скриптом:
ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****'
6 - наконец-то
сможет подключиться, если все последние шаги будут satisied как:
SQLCMD -U sa -P newPassword -S 192.168.0.120SQLEXPRESS,1433
, введя в командной строке: строка подключения в C# будет очень похож. Мне придется заменить -U для пользователя,- P для пароля и-S для источника данных. Я не помню точных имен.
2 ответов
Я тестировал ниже код SQL Server 2008 R2 Express и я считаю, что мы должны иметь решение для всех 6 шагов, которые вы наметили. Давайте возьмемся за них один за другим:
1-Включить TCP / IP
мы можем включить протокол TCP/IP с WMI:
set wmiComputer = GetObject( _
"winmgmts:" _
& "\.\root\Microsoft\SqlServer\ComputerManagement10")
set tcpProtocols = wmiComputer.ExecQuery( _
"select * from ServerNetworkProtocol " _
& "where InstanceName = 'SQLEXPRESS' and ProtocolName = 'Tcp'")
if tcpProtocols.Count = 1 then
' set tcpProtocol = tcpProtocols(0)
' I wish this worked, but unfortunately
' there's no int-indexed Item property in this type
' Doing this instead
for each tcpProtocol in tcpProtocols
dim setEnableResult
setEnableResult = tcpProtocol.SetEnable()
if setEnableResult <> 0 then
Wscript.Echo "Failed!"
end if
next
end if
2-Откройте правильные порты в брандмауэре
Я считаю, что ваше решение будет работать, просто убедитесь, что вы указали правильный порт. Я предлагаю выбрать другой порт, чем 1433 и сделайте его статическим портом, который будет прослушиваться SQL Server Express. Я буду использовать 3456 в этом посте, но, Пожалуйста, выберите другой номер в реальной реализации (я чувствую, что мы увидим много приложений, использующих 3456 в ближайшее время: -)
3-Изменить свойства TCP / IP включить IP-адрес
мы можем использовать WMI снова. Так как мы используем статический порт 3456, нам просто нужно обновить два свойства в раздела ipall раздел: отключите динамические порты и установите прослушивание порт 3456
:
set wmiComputer = GetObject( _
"winmgmts:" _
& "\.\root\Microsoft\SqlServer\ComputerManagement10")
set tcpProperties = wmiComputer.ExecQuery( _
"select * from ServerNetworkProtocolProperty " _
& "where InstanceName='SQLEXPRESS' and " _
& "ProtocolName='Tcp' and IPAddressName='IPAll'")
for each tcpProperty in tcpProperties
dim setValueResult, requestedValue
if tcpProperty.PropertyName = "TcpPort" then
requestedValue = "3456"
elseif tcpProperty.PropertyName ="TcpDynamicPorts" then
requestedValue = ""
end if
setValueResult = tcpProperty.SetStringValue(requestedValue)
if setValueResult = 0 then
Wscript.Echo "" & tcpProperty.PropertyName & " set."
else
Wscript.Echo "" & tcpProperty.PropertyName & " failed!"
end if
next
обратите внимание, что мне не нужно было включать какой-либо из отдельных адресов, чтобы заставить его работать, но если это требуется в вашем случае, вы должны иметь возможность легко расширить этот скрипт.
просто напоминание о том, что при работе с WMI, WBEMTest.exe - это ваш лучший друг!
4-включить проверку подлинности в смешанном режиме в sql server
Я хотел бы, чтобы мы могли использовать WMI снова, но, к сожалению, этот параметр не выставляется через WMI. Есть еще два варианта:
использовать
LoginMode
собственностьMicrosoft.SqlServer.Management.Smo.Server
класс, как описано здесь.используйте значение LoginMode в реестре SQL Server, как описано в этот пост. Обратите внимание, что по умолчанию экземпляр SQL Server Express называется
SQLEXPRESS
, поэтому для моего экземпляра SQL Server 2008 R2 Express правильный раздел реестра былHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer
.
5 - Смена пользователя (sa) пароль по умолчанию
у вас есть это покрыто.
6-наконец (подключение к экземпляру)
поскольку мы используем статический порт, назначенный нашему экземпляру SQL Server Express, больше нет необходимости использовать имя экземпляра в адресе сервера.
SQLCMD -U sa -P newPassword -S 192.168.0.120,3456
пожалуйста, дайте мне знать, если это работает для вас (пальцы скрещенными!).
Я рекомендую использовать SMO (включить сетевой протокол TCP/IP для SQL Server). Однако в моем случае его не было.
я переписал команды WMI из Krzysztof Kozielczyk в PowerShell.
# Enable TCP/IP
Get-CimInstance -Namespace root/Microsoft/SqlServer/ComputerManagement10 -ClassName ServerNetworkProtocol -Filter "InstanceName = 'SQLEXPRESS' and ProtocolName = 'Tcp'" |
Invoke-CimMethod -Name SetEnable
# Open the right ports in the firewall
New-NetFirewallRule -DisplayName 'MSSQL$SQLEXPRESS' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1433
# Modify TCP/IP properties to enable an IP address
$properties = Get-CimInstance -Namespace root/Microsoft/SqlServer/ComputerManagement10 -ClassName ServerNetworkProtocolProperty -Filter "InstanceName='SQLEXPRESS' and ProtocolName = 'Tcp' and IPAddressName='IPAll'"
$properties | ? { $_.PropertyName -eq 'TcpPort' } | Invoke-CimMethod -Name SetStringValue -Arguments @{ StrValue = '1433' }
$properties | ? { $_.PropertyName -eq 'TcpPortDynamic' } | Invoke-CimMethod -Name SetStringValue -Arguments @{ StrValue = '' }
# Restart SQL Server
Restart-Service 'MSSQL$SQLEXPRESS'