Подтвердить что ты не робот

Включить удаленные подключения tcp\ip к sql-серверу, уже установленную базу данных с кодом или script (запрос)

Я развертываю sql express с моим приложением. Мне понравится, что этот механизм базы данных принимает удаленные подключения. Я знаю, как настроить это руководство, запустив диспетчер конфигурации SQL Server, включив подключения tcp/ip, указав порты и т.д. Мне интересно, можно ли сделать то же самое из командной строки.

Или, может быть, мне придется создать "Project Server 2008 SQL Server" в visual studio.

РЕДАКТИРОВАТЬ 1

Я разместил здесь один и тот же вопрос, но мне хотелось бы сделать то же самое на экземпляре sql express, который уже установлен. Посмотрите здесь вопрос

EDIT 2

Я нашел эти ссылки, которые претендуют на выполнение чего-то подобного, и я все еще не могу заставить его работать.

1) http://support.microsoft.com/kb/839980

2) http://social.msdn.microsoft.com/Forums/en-US/sqlexpress/thread/c7d3c3af-2b1e-4273-afe9-0669dcb7bd02/

3) http://www.sql-questions.com/microsoft/SQL-Server/34211977/can-not-connect-to-sql-2008-express-on-same-lan.aspx

4) http://datazulu.com/blog/post/Enable_sql_server_tcp_via_script.aspx


РЕДАКТИРОВАТЬ 3

Как сказал Кшиштоф в своем ответе, мне нужны (и другие вещи, которые я знаю, которые требуются)

1 - включить TCP/IP

enter image description here

Мне удалось это сделать при установке нового экземпляра SQLExpress, передающего параметр /TCPENABLED=1. Когда я устанавливаю sql express как в в этом примере. этот экземпляр sql express будет иметь протокол TCP/IP

2 - Откройте правильные порты в брандмауэре

(Я сделал это руководство, но я верю, что смогу выяснить, как это сделать с помощью С#) До сих пор я должен играть с этой консольной командой:

netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT

3 - Изменение свойств TCP/IP включает IP-адрес

enter image description here

Мне не удалось выяснить, как включить IP-адрес, изменить порт и т.д. Я думаю, что этот шаг будет более сложным для решения

4 - Включить аутентификацию смешанного режима в SQL Server

enter image description here

Мне это удалось, когда установка SQL Express, передающая параметр /SECURITYMODE=SQL, относится к ссылке на шаг 1.

SQL Server express требует, чтобы этот тип аутентификации принимал удаленные подключения.

5 - Изменить пользователя (sa) по умолчанию passowrd

По умолчанию у учетной записи sa есть NULL passowrd. Чтобы принимать соединения, у этого пользователя должен быть пароль. Я изменил параметр passowrd по умолчанию sa с помощью script:

ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****' 

6 - наконец

сможет подключиться, если все последние шаги удовлетворяются как:

SQLCMD -U sa -P newPassword -S 192.168.0.120\SQLEXPRESS,1433

набрав это в командной строке: строка соединения в С# будет очень похожей. Мне нужно будет заменить -U для пользователя, -P для пароля и -S для источника данных. Я не помню точных имен.

4b9b3361

Ответ 1

Я тестировал ниже код с 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 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

Обратите внимание, что мне не нужно было активировать какой-либо отдельный адрес, чтобы он работал, но если это необходимо в вашем случае, вы можете легко расширить этот script, чтобы сделать это.

Напоминаем, что при работе с WMI WBEMTest.exe является вашим лучшим другом!

4 - Включить аутентификацию смешанного режима на сервере sql

Я бы хотел, чтобы мы снова могли использовать 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

Пожалуйста, дайте мне знать, если это работает для вас (пальцы скрещены!).

Ответ 2

Я рекомендую использовать 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'