Kobarin's Development Blog

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

Umbraco : 1つのデータベース内に複数サイト

Umbracoの開設は、下記サイトのようなチュートリアル通りに進めればほぼ難なく出来る事がわかりました。
www.buildinsider.net

ただ、複数サイトを作成しようとすると、幾つか問題があります。
Umbracoサイト毎にデータベースを用意するのであれば問題になりませんが、自社で使う簡易的なサイトや同じ顧客のためにサイトを複数作る時など、できれば同じデータベース内で管理したいと思います。
そうした場合、上記チュートリアルの通りに進めても上手くインストール出来ません。
Webサイト側はVisualStudiodで新たに作れば良いだけですが、データベース側(SQL server)ではTABLE(cmsContent等)が重複するため、インストール途中で失敗します。

そこで、以下の流れに沿って進める事で複数サイト開設ができたのでメモしておきます(例として2サイトを作成)。

  1. Umbracoサイトを2つ作成
  2. Umbraco用のデータベースを1つ作成
  3. SqlServerログインを2つ作成
  4. データベースロールを2つ作成
  5. 各DBロールに、スキーマレベルのCREATE TABLE権限を付与
  6. 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ログインを作成
  1. SqlServerManagementStudioを開く
  2. [セキュリティ]→[ログイン] で右クリックし、「新しいログイン」
  3. [ログイン名] に「umbuser1」を入力
  4. [SQL Server認証]を選択し、パスワードを登録
  5. [既定のデータベース]に「UmbracoDemoDb」を選択
  6. [ユーザーマッピング]で「UmbracoDemoDb」を選択し、[ユーザー]に「umbuser1」、[スキーマ]に「umb1」を入力

一般的な説明では「データベース ロール メンバーシップ」の「db_owner」にチェックを入れますが、ここはオフで。チェックを入れるとインストールに失敗します。

4.データベースロールを作成
  1. SSMSで [UmbracoDemoDb]→[セキュリティ]→[ロール]→[データベースロール] を右クリックし、「新しいデータベースロール作成」
  2. [ロール名]に「umb_role1」を入力
  3. [所有者]に「dbo」
  4. [このロールが所有するスキーマ]に「umb1」
  5. [このロールのメンバー]に「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を外す事で指定スキーマにしかアクセス出来ないようにしています。