Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

ASP.NET MVCからSQL ServerにWindows認証ログインで接続し、イニシャライザーを実行させる

Entity Frameworkではイニシャライザーを使うことで、データモデルに基づき

  • データベースの作成
  • テーブルの作成
  • レコードの初期生成

を自動実行してくれます。

まずはLocalDBでなくSQL Server接続の接続文字列を取得

Visual Studio環境であれば /app_data/~.mdf が生成されますが、これはLocalDBといい、実用上はLocalDBではなくSQL Serverへの通常接続を行います。
そこで、まずはSQL Serverへの接続文字列から生成する事になります。

以下の操作により、接続文字列を取得できます。

  1. VSの「サーバーエクスプローラー」(右上のソリューションエクスプローラーと並列に並んでいます)を選択
  2. 「データ接続」を右クリックし「接続の追加」
  3. 「データソース」の中から「Microsoft SQL Server」を選択(Microsoft SQL Server データファイルではない)
  4. 「サーバーにログオンする」から「Windows認証を使用する」
  5. ご自身のDBを選択し、テスト接続できることを確認してください
  6. 「詳細設定」ボタンを押しと現れるウィンドウの最下部に「Data Source=~」で始まる接続文字列があるので、全て選択してコピーする
  7. コピーした接続文字列を、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グループに属しているため)。
操作は以下のとおり。

  1. SSMS > セキュリティ > ログイン > BUILTIN\Users
    を選択
  2. 右クリックして「プロパティ」を開く。すると「ログインのプロパティ」が現れる。
  3. 左ペインの「ページの選択」から「サーバーロール」を選択
  4. 「dbcreator」にチェックし、「OK」ボタンで閉じる

以上です。
これにて、IIS上からイニシャライザーが実行できるはずです。
実行してエラーが表示されなければ、SSMSを開いてご確認ください。データーベースが表示され、その中のテーブルがデータモデルと一致していれば成功です。

なお繰り返しになりますが、Visual Studio上から実行するIIS Expressではありません。VS上から実行しても/app_data/~.mdfが作られるだけです。

後処理

BUILTIN\Usersがずっとdbcreatorのままでは危険なので、イニシャライザーの実行後はサーバーロールから外しておきましょう。