AWS EC2でSQLServerのインスタンスを作ったときにExpressエディションではリモートからアクセスできなかった。 Webエディションではできたのに。
エディションによって、ネットワーク構成の既定値が違うらしい。Expressエディションでは、TCP/IPが無効になっている。
SQL Server の既定のネットワーク構成
GUIの構成マネージャーから有効にすればOK。 でもコマンドラインからしたい。
SQLServer管理オブジェクト(SMO)が用意されているのでこれを使えばいいらしい。 SMOは.NET Framework アセンブリなのでPowerShellから使える。
サーバー ネットワーク プロトコルを有効または無効にする方法 (SQL Server PowerShell)
SQL Server 管理オブジェクト (SMO) プログラミング ガイド
SQL Server PowerShell
#TCP/IPでの接続を有効にする(SQLServerの再起動が必要) Set-ExecutionPolicy -Scope Process RemoteSigned -Force Impoert-Module 'sqlps' $wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer' $tcp = $wmi.GetSmoObject("ManagedComputer[@Name='computerName']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']") $tcp.IsEnabled = $true $tcp.Alter()
今回は必要なSMOアセンブリだけを読み込めば十分なんだけど、sqlpsモジュールをインポートしとけばロードされるアセンブリに必要なものが含まれてるから便利。
初期値がListenAll=yesになっているので、IsEnable=trueにすれば全部のIPアドレスが有効になる。
ServerProtocol クラス (Microsoft.SqlServer.Management.Smo.Wmi)
::SQLServerを再起動する net stop MSSQLSERVER /y net start SQLSERVERAGENT
停止するときは、/yオプションでエージェントも停止させる。 エージェントを起動するとSQLServer本体も起動する。