Włączanie zdalnych połączeń tcpip do już zainstalowanej bazy danych SQL server express za pomocą kodu lub skryptu (zapytanie)
Wdrażam SQL express z moją aplikacją. Chciałbym, aby ten silnik bazy danych akceptował połączenia zdalne. Wiem jak skonfigurować tą instrukcję poprzez uruchomienie SQL server configuration manager, włączenie połączeń tcp / ip, określenie portów itp.. Zastanawiam się, czy będzie można zrobić to samo z linii poleceń.
A może będę musiał stworzyć "SQL Server 2008 Server Project" w visual studio.
Edycja 1
Zamieściłem to samo pytanie tutaj, ale chciałbym zrobić to samo na instancji SQL express, który jest już zainstalowany. spójrz na pytanie tutaj
Edycja 2
Znalazłem te linki, które twierdzą, że robią coś podobnego i nadal nie mogę tego zrobić.
1) http://support.microsoft.com/kb/839980
4) http://datazulu.com/blog/post/Enable_sql_server_tcp_via_script.aspx
Edycja 3
Jak stwierdził Krzysztof w odpowiedzi potrzebuję (plus inne rzeczy, które Wiem, że są wymagane)
1 - enable TCP / IP
Udało mi się to zrobić podczas instalacji nowej instancji SQLEXPRESS parametr /TCPENABLED=1
. Kiedy instaluję SQL express jak w ten przykład. ta instancja SQL express będzie miała włączony TCP / IP
2 - Otwórz odpowiednie porty w firewallu
(zrobiłem to ręcznie, ale wierzę, że będę w stanie wymyślić, jak to zrobić z c#) Na razie muszę grać w arouda z tą konsolową komendą:
netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT
3 - Modify TCP / IP properties enable a IP address
Nie byłem w stanie zrozumieć jak włączyć IP, zmienić port itp.. myślę, że będzie to krok bardziej skomplikowany do rozwiązania
4 - Włącz uwierzytelnianie w trybie mieszanym w sql server
Udało mi się to zrobić podczas instalacji SQL Express przekazując parametr /SECURITYMODE=SQL
patrz link Krok 1.
SQL Server express wymaga tego typu uwierzytelniania, aby akceptować połączenia zdalne.
5 - Zmień domyślne hasło użytkownika (sa)
Domyślnie konto sa ma NULL passowrd. Aby akceptować połączenia, użytkownik musi posiadać hasło. Zmieniłem domyślne hasło sa przy pomocy skryptu:
ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****'
6 - wreszcie
Będzie w stanie połączyć się, jeśli wszystkie ostatnie kroki zostaną spełnione jako:
SQLCMD -U sa -P newPassword -S 192.168.0.120\SQLEXPRESS,1433
Wpisując to w wierszu poleceń: łańcuch połączeń w C# będzie bardzo podobny. Będę musiał zastąpić -U dla użytkownika ,- P dla hasła i-S dla źródła danych. Nie pamiętam dokładnych nazwisk.
2 answers
Przetestowałem poniższy kod z SQL Server 2008 R2 Express i uważam, że powinniśmy mieć rozwiązanie dla wszystkich 6 kroków, które opisałeś. Zajmijmy się nimi jeden po drugim:
1-Enable TCP / IP
Możemy włączyć protokół TCP / IP za pomocą 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-Otwórz odpowiednie porty w firewallu
Wierzę, że Twoje rozwiązanie zadziała, po prostu upewnij się, że podałeś odpowiedni port. Proponuję wybrać inny port niż 1433 i zrobić z niego statyczny port SQL Server Express będzie nas słuchał. W tym poście będę używał 3456, ale proszę wybrać inny numer w prawdziwej implementacji (czuję, że wkrótce zobaczymy wiele aplikacji korzystających z 3456 :-)
3-Modify TCP / IP properties enable a IP address
Możemy ponownie użyć WMI. Ponieważ używamy portu statycznego 3456, wystarczy zaktualizować dwie właściwości w sekcji IPAll : wyłączyć porty dynamiczne i ustawić port nasłuchu na 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
Zauważ, że nie miałem aby włączyć dowolny z poszczególnych adresów, aby to działało, ale jeśli jest to wymagane w Twoim przypadku, powinieneś być w stanie łatwo rozszerzyć ten skrypt, aby to zrobić.
Przypomnę tylko, że podczas pracy z WMI, WBEMTest.exe jest twoim najlepszym przyjacielem!
4-Włącz uwierzytelnianie w trybie mieszanym w sql server
Chciałbym ponownie użyć WMI, ale niestety to ustawienie nie jest narażone przez WMI. Istnieją dwie inne opcje:
Use
LoginMode
property ofMicrosoft.SqlServer.Management.Smo.Server
Klasa, zgodnie z opisem tutaj .Użyj wartości LoginMode w rejestrze SQL Server, jak opisano w ten post . Zauważ, że domyślnie instancja SQL Server Express ma nazwę
SQLEXPRESS
, więc dla mojej instancji SQL Server 2008 R2 Express właściwy klucz rejestru byłHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer
.
5-Zmień domyślne hasło użytkownika (sa)
Masz to pod kontrolą.6-Finally (connect to the instance)
Ponieważ używamy portu statycznego przypisany do naszej instancji SQL Server Express, nie ma już potrzeby używania nazwy instancji w adresie serwera.
SQLCMD -U sa -P newPassword -S 192.168.0.120,3456
Proszę dać mi znać, jeśli to działa dla Ciebie (trzymam kciuki!).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32
Zalecam użycie SMO (Enable TCP / IP Network Protocol for SQL Server ). Jednak w moim przypadku nie było ono dostępne.
Przepisałem komendy WMI od Krzysztofa Kozielczyka do 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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-20 07:26:08