Umbraco : 1つのデータベース内に複数サイト
Umbracoの開設は、下記サイトのようなチュートリアル通りに進めればほぼ難なく出来る事がわかりました。
www.buildinsider.net
ただ、複数サイトを作成しようとすると、幾つか問題があります。
Umbracoサイト毎にデータベースを用意するのであれば問題になりませんが、自社で使う簡易的なサイトや同じ顧客のためにサイトを複数作る時など、できれば同じデータベース内で管理したいと思います。
そうした場合、上記チュートリアルの通りに進めても上手くインストール出来ません。
Webサイト側はVisualStudiodで新たに作れば良いだけですが、データベース側(SQL server)ではTABLE(cmsContent等)が重複するため、インストール途中で失敗します。
そこで、以下の流れに沿って進める事で複数サイト開設ができたのでメモしておきます(例として2サイトを作成)。
- Umbracoサイトを2つ作成
- Umbraco用のデータベースを1つ作成
- SqlServerログインを2つ作成
- データベースロールを2つ作成
- 各DBロールに、スキーマレベルのCREATE TABLE権限を付与
- Umbracoインストール
設定例
なお、各サイトのログイン設定は以下の通りとします。
項目 | サイト1 | サイト2 |
---|---|---|
データベース | UmbracoDemoDb | UmbracoDemoDb |
ログイン | umbuser1 | umbuser2 |
スキーマ | umb1 | umb2 |
データベースロール | umb_role1 | umb_role2 |
それでは進めてみましょう。
手順
1.Umbracoサイトを2つ作成
Visual StudioでUmbracoのプロジェクトを2つ作成しましょう。この部分は説明の必要はないと思うので割愛します。
2.Umbraco用のデータベースを作成
SSMSでデータベースをUmbraco用に1つ作成します。ここでは「UmbracoDemoDb」というDBにします。
3.SqlServerログインを作成
- SqlServerManagementStudioを開く
- [セキュリティ]→[ログイン] で右クリックし、「新しいログイン」
- [ログイン名] に「umbuser1」を入力
- [SQL Server認証]を選択し、パスワードを登録
- [既定のデータベース]に「UmbracoDemoDb」を選択
- [ユーザーマッピング]で「UmbracoDemoDb」を選択し、[ユーザー]に「umbuser1」、[スキーマ]に「umb1」を入力
一般的な説明では「データベース ロール メンバーシップ」の「db_owner」にチェックを入れますが、ここはオフで。チェックを入れるとインストールに失敗します。
4.データベースロールを作成
- SSMSで [UmbracoDemoDb]→[セキュリティ]→[ロール]→[データベースロール] を右クリックし、「新しいデータベースロール作成」
- [ロール名]に「umb_role1」を入力
- [所有者]に「dbo」
- [このロールが所有するスキーマ]に「umb1」
- [このロールのメンバー]に「umbuser1」を選択
5.DBロールに、スキーマレベルのCREATE TABLE権限を付与
最後に、SSMSで以下のクエリーを実行します。
USE UmbracoDemoDb GRANT ALTER ON Schema :: umb1 TO umb_role1 GRANT CREATE TABLE TO umb_role1 GO
このコードは以下の書込みを参考にしました。
serverfault.com
なお、実行すると以下のメッセージが表示されますが、正常に完了しているので大丈夫です。
sa、dbo、エンティティ所有者、information_schema、sys、または自分自身に対する権限を許可、拒否、または取り消すことはできません。
6.Umbracoインストール
以上で1サイト用のログインは完成です。
Umbracoのインストールで、ここで設定したログインを入力すれば、スキーマ付きでTABLEが登録されます。
2つ目以降のサイトも同様に、ログイン名・データベースロール名・スキーマ名を変えて設定し、Umbracoのインストール画面でログインすれば、指定したスキーマでTABLEが作成されます。
あと、Umbracoのよくある解説サイトでは、ログインを作成する際に「db_owner」を選択しますが、これをしてしまうとインストール時に失敗します(当方の場合は「umbracoMigrationが無効」と出ました)。
どうもアクセスできてしまうだけでエラーになってしまうので、ここではdb_ownerを外す事で指定スキーマにしかアクセス出来ないようにしています。