はじめに
プリザンターの隠れた機能としてマルチテナント機能が存在します。本来はSaaSとしてプリザンターを提供する場合に使用される機能ですが、社内でも事業部毎にテナントとして分離したい場合などに便利に使える機能です。
今回のマルチテナントを有効化する方法を紹介します。
商用ライセンスでは無制限なSaaS提供を禁止するために利用規約に提供範囲の制約が入っています。マルチテナントを使用する場合は利用規約と照らし合わせて違反がないようにしてください。
テナントを追加
まずはテナントをします。これはGUIでは出来ないので、SQLでクエリを発行します。
INSERT INTO [dbo].[Tenants]
([TenantName],
[Creator],
[Updator])
VALUES
(@テナント名,
0,
0)
GO
追加するとTenantIdが自動採番されるのでメモしておいてください。
テナントの1人目のユーザを追加
SQLで追加する方法とGUIから追加する方法の2つがあるのですが、GUIで追加してからSQLでTenantIdを付け替える方法を使用します。通常通りの手順でユーザを追加します。
ユーザを追加したらUserIdが自動採番されるのでメモをしておいてください。
次にSQLでクエリを発行します。
UPDATE
[Users]
SET
[TenantId] = @先ほど採番されたTenantId
WHERE
[UserId] = @先ほど採番されたUserId
これで先ほど作成したユーザでログインすると追加したテナント環境にログイン出来ます。
テナント情報の編集
通常はシングルテナントでの運用が想定されているため「テナントの管理」の画面にアクセスするとデフォルトで作成されるTenantId=0のものにしかアクセス出来ません。そのためURLを手動で書き換える必要があります。
-/tenants/edit
+/tenants/{TenantId}/edit
マルチテナント使用時の注意事項
テナントの管理
インプリム社がホスティングするPleasanter.net以外のユーザーが作成・運用する環境では、シングルテナントでの使用しか想定されていないため、いろいろと注意すべきことがあります。特に注意が必要なのは「テナントの管理」画面へのアクセスです。パーミッションの制御がおこなわれないためテナント管理者の権限があればURLさえ書き換えれば、どのテナントの管理画面にもアクセス出来てしまいます。これを防ぐためには運用面でのカバーが必要になります。一番のオススメの方法は
- 全体的なテナントの管理をおこなう為だけのテナントを作成する
- 管理テナントに所属するユーザのみテナント管理者の権限を付与する
- 被管理のテナントではテナント管理者の権限を付与したユーザは作成しない
の3点で運用することです。
テナント間でのデータ共有の制約
SQLの内部実装として、TenantIdが常に条件に組み込まれたSQLが発行されデータの抽出をおこなっています。そのため、標準機能ではテナント間でのデータ共有はできません。また、ユーザについても完全に分離されません。
特命プロジェクトのためにテナントを分けるなどの運用を思いつくかと思いますが、データを絶対に共有しないという条件下でのみマルチテナント化を検討するようにしてください。
拡張SQL
前項のテナント間のデータ共有の制限を突破するただ一つの方法が拡張SQLです。裏を返せばきちんとクエリを組み立てなければ他のテナントのデータをCRUDできてしまうということになります。
クエリ作成時にTenantIdを条件に加えるのを忘れないようにしてください。マニュアルにはTenantIdを取得するための変数が用意されているので、確認してみてください。
Extentionsテーブルに格納する方法を使用するとこのあたりの制限が緩和されるケースもあるので、ファイルではなくExtentionsテーブルに格納するようにするのも1つの手ではあります。
拡張機能
拡張スタイルや拡張サーバスクリプト、拡張ナビゲーションメニューなどもテナントの垣根を越えて実行されます。これも拡張SQL同様にExtentionsテーブルに格納する方法を使用するとこのあたりの制限が緩和されるケースもあるので、ファイルではなくExtentionsテーブルに格納するようにするのも1つの手ではあります。
まとめ
今回はプリザンターをマルチテナントで使用する方法を紹介しました。公式に出来ることがアナウンスされている機能ではないため管理面で若干の不自由さや、TenantId回りの制約が発生しますがどれも運用でカバー出来る範囲のものです。規模が大きな組織では便利に使える機能ではあるので、是非試して見てください。