ASP.NET MVCからSQL ServerにWindows認証ログインで接続し、イニシャライザーを実行させる
Entity Frameworkではイニシャライザーを使うことで、データモデルに基づき
- データベースの作成
- テーブルの作成
- レコードの初期生成
を自動実行してくれます。
まずはLocalDBでなくSQL Server接続の接続文字列を取得
Visual Studio環境であれば /app_data/~.mdf が生成されますが、これはLocalDBといい、実用上はLocalDBではなくSQL Serverへの通常接続を行います。
そこで、まずはSQL Serverへの接続文字列から生成する事になります。
以下の操作により、接続文字列を取得できます。
- VSの「サーバーエクスプローラー」(右上のソリューションエクスプローラーと並列に並んでいます)を選択
- 「データ接続」を右クリックし「接続の追加」
- 「データソース」の中から「Microsoft SQL Server」を選択(Microsoft SQL Server データファイルではない)
- 「サーバーにログオンする」から「Windows認証を使用する」
- ご自身のDBを選択し、テスト接続できることを確認してください
- 「詳細設定」ボタンを押しと現れるウィンドウの最下部に「Data Source=~」で始まる接続文字列があるので、全て選択してコピーする
- コピーした接続文字列を、web.configのconnectionstring内の<add~内に記載
上記までで、Windows認証によりSQL Serverへの接続ができることになりますが、今回はイニシャライザーにて「DB作成、TABLE作成、レコード生成」を行うため、権限不足です。当然、権限設定を事前に適切に行う必要があります。
ちなみに、このまで何も設定せずに「Webを発行」してブラウザからサイトを開いてみる(VSから起動するIIS Expressではない)と、イニシャライザーが実行されようとする段階でSQL Server関連のエラーが発生し、「CREATE権限がありません」といった旨のエラーが発生すると思います。
では「どのユーザー(SQLServerログイン)にどの程度の権限を与えればよいのか?」という事になりますが、この事について解説していきます。
ASP.NET実行ユーザーにCREATE権限を与える
まず今回、以下のサイトを参考にさせて頂きました。
ASP.NET で MSSQL に Windows 認証で接続 | クリエイティブ Web
記事中には「アプリケーションプール毎にログインユーザーを作成する」とありますが、開発用マシン等の緩い環境の場合には、解説内にもある通り「BUILTIN\Users」グループに対して権限設定すれば良いと思います(アプリケーションプール毎のログインユーザーは、Usersグループに属しているため)。
操作は以下のとおり。
- SSMS > セキュリティ > ログイン > BUILTIN\Users
を選択 - 右クリックして「プロパティ」を開く。すると「ログインのプロパティ」が現れる。
- 左ペインの「ページの選択」から「サーバーロール」を選択
- 「dbcreator」にチェックし、「OK」ボタンで閉じる
以上です。
これにて、IIS上からイニシャライザーが実行できるはずです。
実行してエラーが表示されなければ、SSMSを開いてご確認ください。データーベースが表示され、その中のテーブルがデータモデルと一致していれば成功です。
なお繰り返しになりますが、Visual Studio上から実行するIIS Expressではありません。VS上から実行しても/app_data/~.mdfが作られるだけです。
後処理
BUILTIN\Usersがずっとdbcreatorのままでは危険なので、イニシャライザーの実行後はサーバーロールから外しておきましょう。