ユーザーインスタンスの機能を利用した MDF ファイルの作成と配布
SQL Server 2005 Express Edition では、Access の MDB ファイルを扱うのと同じような感覚でデータベースを手軽に扱えるようにとユーザーインスタンスの機能が導入されました。ユーザーインスタンスの機能は、管理者以外のユーザーでも自分のアカウントで SQL Server のプロセスを起動して実行できるようにする機能で、MDF ファイルを動的にアタッチすることができます。また、自動デタッチ機能も備えており、アプリケーションが終了すると自動的にMDF ファイルをデタッチするので、ユーザーがデタッチの操作をすることなくデータベースのコピーが可能になります。
※注意!
Windows 7 と Vista sp2 以降では、IIS のアプリケーションプールのデフォルトのワーカープロセス ID (IIS 7 のアクセス許可を参照)では、以下の図のように「クライアントの権限借用中のエラーにより、SQL Server のユーザー インスタンスを生成できませんでした。接続は閉じられます。」というエラーが発生して、ユーザーインスタンスを生成できません。ワーカープロセス ID を ApplicationPoolIdentity から NETWORK SERVICE 等に変更すれば、接続ができるようになりますが、セキュリティ的にはかなりレベルが下がります。Visual Studio の開発サーバー上では問題なく動作するので、開発中の利用には問題はありませんが、運用を始める時には、通常の方法でデータベースをアタッチしてユーザーも設定するようにして使用するのが確実です。また、「SQL Server オンライン ブック」のユーザー インスタンスの説明では、「この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。」となっており、そういう点でも運用サーバーではおすすめの方法ではありません。
以下、簡単に設定の手順をメモしておきます。
1. 空のデーターベース (.mdf ファイル)を作成
1-1 Visual Studio を立ち上げて、Web アプリケーションを作成する。
1-2 ソリューション エクスプローラの App_Data フォルダーを右クリックして、 「追加」、「新規項目」をクリックします。
1-3 「SQL Server データベース」を選択し、ファイル名(ここでは、Umbraco.mdf)を入力します。
1-4 エクスプローラでデータベースファイルを表示する。 (Visual Studio で App_Data を右クリックして、「エクスプローラでフォルダを開く」を選択すれば表示できます)
1-5 Visual Studio を終了して、データベースを閉じた状態にする。
2. アプリケーションでの使用
2-1 インストールフォルダに、App_Data フォルダを作成する。
2-2 作成した .mdf ファイル(ここでは Umbraco.mdf) を App_Data フォルダにコピーします。 (ログファイル Umbraco_log.LDF はコピーしなくても作成されます。)
2-3 名前付きインスタンス(インスタンス名 SQLEXPRESS)の場合、接続文字列を以下のように設定します。(既定のインスタンスの場合、Data Source の \SQLEXPRESS を省略します)
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True;User Instance=True;
Umbraco の場合は、Web.config の編集をしなくても、設定ウィザードで接続文字列の設定ができます。設定ウィザードの 2/5 で、Type を 「Custom connection」 に設定して、Connection string を以下のように設定します。
datalayer=SqlServer;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True;User Instance=True;
※Umbraco の場合の注意!
Windows 7 と Vista sp2 以降で、アプリケーションプールのワーカープロセス ID が ApplicationPoolIdentity になっていた場合にも、「Database connection initialisation failed. The installer cannot connect to the databese. 」というエラーメッセージが設定ウィザードの画面に表示されるだけなので、接続文字列の入力ミスとの区別ができません。