私は自分のアプリケーションでSQL Expressをデプロイしています。そのデータベースエンジンがリモート接続を受け入れるようにします。 SQL Server構成マネージャーを起動し、tcp/ip接続を有効にし、ポートを指定するなどして、そのマニュアルを構成する方法を知っています。コマンドラインから同じことを行うことができるかどうか疑問に思っています。
または、Visual Studioで「SQL Server 2008 Server Project」を作成する必要があるかもしれません。
ここに同じ質問を投稿しましたが、すでにインストールされているsql expressのインスタンスで同じことをしたいと思います。 ここの質問を見てください
同様のことを行うことを主張するこれらのリンクを見つけましたが、それを機能させることはできません。
1) http://support.Microsoft.com/kb/83998
4) http://datazulu.com/blog/post/Enable_sql_server_tcp_via_script.aspx
Krzysztofが彼の応答で述べたように、私が必要とする(それに加えて、私が知っている必要なもの)
1-TCP/IPを有効にする
パラメーター/TCPENABLED=1
を渡すSQLExpressの新しいインスタンスをインストールするときに、これをなんとかすることができました。 この例 のように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サーバーで混合モード認証を有効にします
パラメータ/SECURITYMODE=SQL
を渡してSQL Expressをインストールするときに、これを行うことができました。ステップ1のリンクを参照してください。
SQL Server Expressでは、リモート接続を受け入れるためにこの認証タイプが必要です。
5-ユーザーの変更(sa)デフォルトpassowrd
デフォルトでは、saアカウントにはNULLパスワードがあります。接続を受け入れるには、このユーザーにパスワードが必要です。スクリプトでsaのデフォルトのパスワードを変更しました。
ALTER LOGIN [sa] WITH PASSWORD='*****newPassword****'
6-最後に
すべての最後のステップが次のように満たされている場合、接続できます。
SQLCMD -U sa -P newPassword -S 192.168.0.120\SQLEXPRESS,1433
コマンドラインでそれを入力することにより:C#の接続文字列は非常に似ています。ユーザーの-U、パスワードの-P、およびデータソースの-Sを置き換える必要があります。正確な名前は思い出せません。
SQL Server 2008 R2 Express を使用して以下のコードをテストしましたが、説明した6つのステップすべてに解決策があるはずです。それらを1つずつ取り上げましょう。
[〜#〜] wmi [〜#〜] でTCP/IPプロトコルを有効にできます。
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
あなたのソリューションはうまくいくと思います。正しいポートを指定してください。 1433とは異なるポートを選択し、SQL Server Expressがリッスンする静的ポートにすることをお勧めします。この投稿では3456を使用しますが、実際の実装では別の番号を選択してください(3456を使用する多くのアプリケーションがすぐに表示されると思います:-)
WMIを再び使用できます。静的ポート3456を使用しているため、IPAllセクションの2つのプロパティを更新するだけです。動的ポートを無効にし、リスニングポートを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 があなたの親友であることを思い出してください!
WMIを再び使用できればいいのですが、残念ながらこの設定はWMIを通じて公開されていません。他の2つのオプションがあります。
here で説明されているように、Microsoft.SqlServer.Management.Smo.Server
クラスのLoginMode
プロパティを使用します。
この投稿 で説明されているように、SQL ServerレジストリでLoginMode値を使用します。デフォルトでは、SQL Server Expressインスタンスの名前はSQLEXPRESS
であるため、SQL Server 2008 R2 Expressインスタンスの場合、正しいレジストリキーはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQLServer
でした。
これをカバーしました。
SQL Server Expressインスタンスに割り当てられた静的ポートを使用しているため、サーバーアドレスでインスタンス名を使用する必要がなくなりました。
SQLCMD -U sa -P newPassword -S 192.168.0.120,3456
これがうまくいくかどうか教えてください(指が交差した!)。
SMOを使用することをお勧めします( SQL ServerのTCP/IPネットワークプロトコルを有効にする )。しかし、私の場合は利用できませんでした。
Krzysztof KozielczykからPowerShellにWMIコマンドを書き直しました。
# 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'