#author("2016-09-10T21:47:27+09:00","default:nowsky","nowsky")
*Microsoft SQL Server [#ea1145c4]
-[[SQL Server 2008 Express:+https://www.microsoft.com/ja-jp/download/details.aspx?id=1695]]
-[[SQL Server 2014 Express:+https://www.microsoft.com/ja-jp/download/details.aspx?id=42299]]
-[[SQL Server 2016 Express:+https://www.microsoft.com/ja-JP/download/details.aspx?id=52679]]
#author("2016-09-11T00:47:29+09:00","default:nowsky","nowsky")
*Internet Information Services [#x7f34cce]
-[[Microsoft Developer Network "Web サーバー(IIS)":+https://msdn.microsoft.com/ja-jp/library/hh831725(v=ws.11).aspx]]

マイクロソフトが開発しているRDBMSの一種。SQL ServerとかMSSQLと呼ぶ事が多い。
名前から判るとおりWindows環境で使う事が多く、ADO.NETを使ったシステム構築がしやすいのが特長。
ライセンス料が非常に高く、バージョンによっては100万円する物もある。
 
検証・勉強用として機能制限がされているが無料のSQL Server Expressも用意されており、
余程の事が無ければExpress版で要件を満たせる場合が多い。
Windowsに標準搭載されているWebサーバ。Windows Serverと一部のWindows Clientで利用出来る。
IISではHTTP/HTTPS以外にもSMTP機能を同梱しているのと、.NETアプリと親和性の高い点が特長。
以前、Code Red・Nimdaなどのウイルスから狙われ、大規模障害を起こした事がある。
~
*メモ [#s0409475]
-SQL Server 2016 ExpressからWith Tools等の細分化が無くなり、
SQL Server Management Studioが同梱されなくなった。
-別途、SSMS 2016(無料版)をインストールすれば、今までのWith Tools相当を使う事は出来る。
-SQL Server 2014/2016 Expressだと、1DBで10GBまで構築出来る。
*メモ [#fd28ebb5]
-Windows Client版のIISは、Webサイト作成数・TCPコネクション数などに機能制限がかかっている。
-PHP、ASP等を利用する場合は追加ソフトをインストールする必要がある。
-IIS用プラグインインストーラとして、[[Microsoft Web Platform Installer:+https://www.microsoft.com/web/downloads/platform.aspx]]が用意されている。
~
*インストール [#n4d4e742]
*インストール [#m54d88dd]
&size(16){&font(b){0. 前提条件};};
-構築環境
 [VM]:   Hyper-V ver6.3.9600
 [OS]:   WindowsServer2012R2 64bit
 [MEM]:  4GB
 [HDD]:  C:50GB / D:50GB
 [SQL]:  SQL Server 2016 Express
 [SSMS]: SQL Server Management Studio 2016
 [IIS]:  IIS 8.5.9600

-パラメータ
 [インストール用TEMP]:   C:\SQLServer2016Media
 [DBデータディレクトリ]: D:\Microsoft SQL Server
 [インスタンス構成]:     既定のインスタンス
~
&size(16){&font(b){1. インストール作業};};
IISは「役割と機能の追加ウィザード」から簡単にインストールする事が出来る。
今回はPHPも動かすので、CGI機能を有効化しておく。
 [サーバーマネージャー] -> [役割と機能追加] -> [サーバーの役割]
 ---
 ■ Webサーバー (IIS)
 ├■ Webサーバー
 │├■ HTTP 共通機能
 ││├■ HTTP エラー
 ││├■ ディレクトリの参照
 ││├■ 規定のドキュメント
 ││├■ HTTPエラー
 ││├■ 静的なコンテンツ
 ││├□ HTTP リダイレクト
 ││└□ WebDAV 発行
 ││
 │├■ セキュリティ
 ││├■ 要求フィルター
 ││├□ IIS クライアント証明書マッピング認証
 ││├□ IP およびドメインの制御
 ││├□ SSL 証明書の集中サポート
 ││├□ URL 承認
 ││├□ Windows 認証
 ││├□ クライアント証明書マッピング認証
 ││├■ ダイジェスト認証
 ││└□ 基本認証
 ││
 │├■ パフォーマンス
 ││├■ 静的なコンテンツの圧縮
 ││└□ 動的なコンテンツの圧縮
 ││
 │├■ 状態と診断
 ││├■ HTTP ログ
 ││├□ ODBC ログ
 ││├□ カスタムログ
 ││├□ トレース
 ││├□ ログ ツール
 ││└□ 要求の監視
 ││
 │└■ アプリケーション開発
 │  ├□ .NET 拡張機能 3.5
 │  ├□ .NET 拡張機能 4.5
 │  ├□ Application Initialization
 │  ├□ ASP
 │  ├□ ASP.NET 3.5
 │  ├□ ASP.NET 4.5
 │  ├■ CGI
 │  ├□ ISAPIフィルター
 │  ├□ ISAPI拡張
 │  ├□ WebSocketプロトコル
 │  └□ サーバー側インクルード

 ├□ FTP サーバー
 │├□ FTP サービス
 │└□ FTP 拡張

 └■ 管理ツール
   ├■ IIS 管理コンソール
   ├□ IIS 6 管理互換
   │├□ IIS 6 メタベース互換
   │├□ IIS 6 WMI互換
   │├□ IIS 6 スクリプトツール
   │└□ IIS 6 管理コンソール

   ├□ IIS 管理スクリプトおよびツール
   └□ 管理サービス

~
&size(16){&font(b){1. インストール作業(MSSQL)};};
Microsoftから事前にSQL Serverのインストーラをダウンロードしておく。
下記手順だとReporting Servicesもインストールしているが、必要無ければインストールをしなくても良い。
&size(16){&font(b){2. PHP連携};};
事前に[[PHP.NET:+https://secure.php.net/]]から、Windows用のPHPバイナリをダウンロードしておく。
PHPにはThread SafeとNon Thread Safeの二種類があるが、特別な事情が無い限りThread Safeを使う。
 
#region(MSSQL 2016 Express インストール手順)
>&ref(sql_express2016_01.png,left,nowrap,50%);
インストーラを起動したらカスタムを選択
PHPのバイナリ保存先については、PHPのディレクトリ名にバージョン番号を付け、
シンボリックリンクでポインタを張ると、バージョンアップ・バージョンダウンのメンテナンスをやりやすくなる。
 筆者がよくやるディレクトリ構成例
 ---
 [リンク]     - C:\php
 [実ファイル] - C:\php-7.0.10
 [実ファイル] - C:\php-7.0.00
 [実ファイル] - C:\php-5.6.25
 ---
 cmd> dir
   <SYMLINKD>     php [php-7.0.10]
   <DIR>          php-7.0.10
   <DIR>          php-7.0.00
   <DIR>          php-5.6.25
 
>&ref(sql_express2016_02.png,left,nowrap,50%);
SQL Serverのインストールで使用するテンポラリを指定
この段階では実際のインストールはまだ動かない -> [インストール]
上記の状態を作るには、下記コマンドを実行する。
Linuxのlnコマンドと書式が逆になる点に注意する。
 コマンドオプション
 ---
 cmd> mklink [[/D] | [/H] | [/J]] リンク ターゲット
 ---
 cmd> mklink /D php php-7.0.10
 
>&ref(sql_express2016_03.png,left,nowrap,50%);
バイナリをダウンロードし出すのでしばらく放置
 
>&ref(sql_express2016_04.png,left,nowrap,50%);
放置していると、SQL Serverのインストーラが起動する
新規インストールの場合「新規スタンドアロンインストール」をクリック
 
>&ref(sql_express2016_05.png,left,nowrap,50%);
「ライセンス条項に同意」をチェック -> [次へ]
 
>&ref(sql_express2016_06.png,left,nowrap,50%);
「SQL Serverの更新プログラムを自動入手」をチェック -> [次へ]
 
>&ref(sql_express2016_07.png,left,nowrap,50%);
インストール要件を満たしているか確認が走る
WindowsFirewallの警告が出るが、後で修正すれば良いので無視 -> [次へ]
 
>&ref(sql_express2016_08.png,left,nowrap,50%);
インストールする機能を選択。殆ど使わないLocalDBだけはチェックを外す
インスタンスルートは、データベース・バックアップ・ログ等が入るディレクトリ
共有機能ディレクトリは、SQL Server実行バイナリのインストール先
今回は上記の通りに選択・入力を行う -> [次へ]
 
>&ref(sql_express2016_09.png,left,nowrap,50%);
「既定のインスタンス」を選択。IDはデフォルトのまま -> [次へ]
 
>&ref(sql_express2016_10.png,left,nowrap,50%);
SQL Serverの実行ユーザを選択。とりあえずデフォルト(上記)のまま
ボリュームメンテナンスタスク実行特権は&color(#ff0000){&font(B){チェックを外す};}; -> [次へ]
 
>&ref(sql_express2016_11.png,left,nowrap,50%);
DBアクセスユーザと認証方法を設定する
デフォルトだとログイン中のOSローカルユーザが登録されるが後から消す事が出来る
SSMSからOSローカルユーザを消せば、結果としてSQL Server認証に限定させる事も出来る -> [次へ]
 
>&ref(sql_express2016_12.png,left,nowrap,50%);
Reporting Servicesは構成処理を行う -> 次へ
 
>&ref(sql_express2016_13.png,left,nowrap,50%);
利用規約を確認する -> [承諾] -> [次へ]
この後は画面に従ってクリックすればインストールが完了する
 
>&ref(sql_express2016_14.png,left,nowrap,50%);
インストールが完了したらインストーラを閉じる
インストーラを閉じたらインストールテンポラリ「C:\SQLServer2016Media」を削除する
#endregion
IISからPHPを利用するには、ハンドラーマッピングにPHPを追加する必要がある。
この時、IISの「アプリケーション開発 - CGI」を利用する。
 [IISマネージャー] -> [Webサイト] -> [ハンドラーマッピング]
 ---
 ┌────────┬─────────┐
 │要求パス        │*.php             │
 ├────────┼─────────┤
 │モジュール      │FastCgiModule     │
 ├────────┼─────────┤
 │実行可能ファイル│C:\php\php-cgi.exe│
 ├────────┼─────────┤
 │名前            │IIS-PHP-Module    │
 └────────┴─────────┘
~
*SQL Server接続 [#m12e7271]
PHPからSQL Serverへ接続してDB操作を行うには、
MicrosoftのPHPドライバを追加インストールし、PHPエクステンションとしてロードする必要がある。
今回使うPHPドライバは下記Developer Networkから入手する。
-[[Microsoft SQL Server 用 PHP Driver:+https://msdn.microsoft.com/ja-jp/library/dn865013(v=sql.105).aspx]]
-[[Microsoft Drivers for PHP for SQL Server:+https://www.microsoft.com/en-us/download/details.aspx?id=20098]]

~
&size(16){&font(b){2. インストール作業(SSMS)};};
SQL ServerをGUI操作する為に、SQL Server Management Studio (SSMS)を追加インストールする。
インストーラは[[MSグローバル:+https://msdn.microsoft.com/en-us/library/mt238290.aspx]]の方からダウンロードを行うが、
インストールの段階で日本語が反映される為、実際には日本語版のSSMSを使う事が出来る。
 
#region(SSMS 2016 インストール手順)
>&ref(ssms2016_01.png,left,nowrap,70%);
事前にインストーラを入手しておく
 
>&ref(ssms2016_02.png,left,nowrap,50%);
規約を読んだら「インストール」を選択
この後、5~10分程度でインストールが完了する
#endregion
PHPドライバはexe形式になっている為、exeを実行してドライバを展開(インストール)する。
ドライバはOSのビット数と、PHPの動作モード毎に数種類がインストールされる為、
自環境に合ったPHPドライバを &font(b){"C:\php\ext" に移動};させる。
-"SQLSRV40.EXE"ドライバのファイル例
|OSのビット数|Thread Safe     |Non Thread Safe             |
|32bit|php_sqlsrv_7_ts_x86.dll|php_sqlsrv_7_nts_x86.dll    |
|~|php_pdo_sqlsrv_7_ts_x86.dll|php_pdo_sqlsrv_7_nts_x86.dll|
|64bit|php_sqlsrv_7_ts_x64.dll|php_sqlsrv_7_nts_x64.dll    |
|~|php_pdo_sqlsrv_7_ts_x64.dll|php_pdo_sqlsrv_7_nts_x64.dll|

~
&size(16){&font(b){3. TCP/IP接続の有効化};};
デフォルトの状態では、IPアドレスによるMSSQL接続が拒否されている為、
SQL Serverのネットワーク構成を変更してTCP/IP接続を有効化する。
TCP/IP接続の設定変更をしただけではTCP/IP接続が有効にならないので、DBの再起動も実施する。
 
#region(MSSQL構成マネージャー設定内容)
-DBインスタンスの構成によって、MSSQL通信に使用するプロトコルとポート番号が変化する。
サーバにFWを設定している場合、内容に合わせてポートを開けておく。
|既定のインスタンス  |TCP:1433                 |
|名前付きインスタンス|UDP:1434 / TCP:1025-65535|
PHPドライバをインストールした後はphp.iniを編集し、PHPドライバをエクステンションとして読み込ませる。
PHPエクステンションを "C:\php\ext" にインストールしている場合、
下記設定をphp.iniの&font(b){[PHP]ディレクティブに追記};する。
ODBCのエクステンションは読み込まなくても大丈夫な筈だが、エラー抑制の為追加しておく。

 [PHP]
 
 ; Directory in which the loadable extensions (modules) reside.
 ; http://php.net/extension-dir
 ; extension_dir = "./"
 ; On windows:
 extension_dir = "ext"
 
 ;;;;;;;;;;;;;;;;;;;;;;
 ; Dynamic Extensions ;
 ;;;;;;;;;;;;;;;;;;;;;;
 extension=php_pdo_odbc.dll
 
 ; Extension DLL for access to Microsoft SQL Server.
 ; See "Microsoft SQL Server PHP Deirver"
 ;     "https://msdn.microsoft.com/ja-jp/library/mt683517(v=sql.105).aspx"
 extension=php_pdo_sqlsrv_7_ts_x64.dll
 extension=php_sqlsrv_7_ts_x64.dll

 
>&ref(mssql_tcpip_01.png,left,nowrap,50%);
「SQL Server 構成マネージャー」->「SQL Server ネットワークの構成」->
「"DBインスタンス名" のプロトコル」->「TCP/IP」->「状態:有効」
 
>&ref(mssql_tcpip_02.png,left,nowrap,50%);
「SQL Server 構成マネージャー」->「SQL Server のサービス」->
「SQL Server "DBインスタンス名"」->「再起動」
#endregion
PHPエクステンションの設定が完了したら、管理ツールからIISを再起動させ、
Webブラウザからphpinfoを開いてドライバ読込み状況を確認する。
今回追加したPHPドライバを正常に読み込んでいる場合、下記ステータスがphpinfoに表示される。
&ref(phpinfo_pdo.png,left,nowrap,50%);