はじめに
プリザンターの拡張機能(拡張スクリプト・拡張SQL・拡張CSS など)は、通常 App_Data/Parameters/ExtendedXxx/ フォルダに JSON ファイルを配置して管理します。しかし、データベースの Extensions テーブルを使用して管理する方法もあります。
マルチクラスタ環境やコンテナ環境など、複数のインスタンスで同一の拡張設定を共有したい場合は、ファイルを各イン��タンスに配布するよりも、データベースで一元管理する方が便利です。さらに、API 経由での CRUD 操作が可能になるため、運用管理の自動化にも対応できます。
この記事では、Extensions テーブルの構造と使い方について解説します。
対応バージョン
- Pleasanter 1.4.7.0 以降
Extensions テーブルの概要
テーブル構造
Extensions テーブルは以下のカラムで構成されています。
| カラム名 | 型 | 説明 |
|---|---|---|
| ExtensionId | int | 拡張機能ID(自動採番) |
| TenantId | int | テナントID |
| ExtensionType | nvarchar(128) | 拡張機能種別 |
| ExtensionName | nvarchar(256) | 拡張機能名 |
| ExtensionSettings | nvarchar(max) | 拡張機能設定(JSON 形式) |
| Body | nvarchar(max) | 本文(スクリプト・SQL・CSS など) |
| Description | nvarchar(max) | 説明 |
| Disabled | bit | 無効フラグ(true で無効化) |
ExtensionType 一覧
ExtensionType カラムには以下の値を指定できます。
| ExtensionType | 説明 |
|---|---|
| Fields | 拡張フィールド(カスタム項目) |
| Html | 拡張HTML(画面への HTML 差し込み) |
| NavigationMenu | 拡張ナビゲーションメニュー |
| Script | 拡張スクリプト(クライアント JS) |
| ServerScript | 拡張サーバースクリプト |
| Sql | 拡張SQL |
| Style | 拡張スタイル(CSS) |
| Plugin | 拡張プラグイン |
| CustomApps | ユーザーテンプレート |
ExtensionSettings の設定方法
ExtensionSettings カラムには、各 ExtensionType に応じた JSON を設定します。すべての種別で共通のフィルタリング設定を使用できます。
共通設定(フィルタリング)
| プロパティ | 型 | 説明 |
|---|---|---|
| SiteIdList | List<long> | 適用対象のサイトIDリスト(空 = 全サイト) |
| UserIdList | List<int> | 適用対象のユーザーIDリスト |
| DeptIdList | List<int> | 適用対象の部署IDリスト |
| GroupIdList | List<int> | 適用対象のグループIDリスト |
| Actions | List<string> | 適用アクション(Edit, New など) |
フィルタリングのリストが空の場合は「条件なし(全適用)」として扱われます。
否定条件は値の先頭に - を付けます(例: ["-5"] は ID=5 を除外)。
具体的な設定例
例1: 特定サイトに JavaScript を追加
SQLで直接レコードを追加する場合の例です。
INSERT INTO Extensions (
TenantId,
ExtensionType,
ExtensionName,
ExtensionSettings,
Body,
Description,
Disabled
) VALUES (
1,
'Script',
'MyCustomScript',
'{"SiteIdList":[12345,67890],"Actions":["Edit","New"]}',
'$(document).ready(function() { console.log("カスタムスクリプト読み込み完了"); });',
'サイトID 12345, 67890 の編集・新規画面で実行されるスクリプト',
0
);
例2: 全サイト共通の CSS スタイル
INSERT INTO Extensions (
TenantId,
ExtensionType,
ExtensionName,
ExtensionSettings,
Body,
Description,
Disabled
) VALUES (
1,
'Style',
'GlobalStyle',
'{}',
'.field-label { font-weight: bold; color: #333; }',
'全サイト共通のカスタムスタイル',
0
);
ExtensionSettings を空のオブジェクト {} にすると、全サイト・全画面で適用されます。
例3: 特定ユーザー向けサーバースクリプト
INSERT INTO Extensions (
TenantId,
ExtensionType,
ExtensionName,
ExtensionSettings,
Body,
Description,
Disabled
) VALUES (
1,
'ServerScript',
'AdminOnlyValidation',
'{"UserIdList":[1,2],"BeforeUpdate":true}',
'if (model.Status < 200) { model.Status = 200; }',
'管理者のみ更新前に実行されるバリデーション',
0
);
例4: API 実行可能な拡張 SQL
拡張 SQL を API から実行可能にするには、ExtensionSettings で "Api": true を設定します。
INSERT INTO Extensions (
TenantId,
ExtensionType,
ExtensionName,
ExtensionSettings,
Body,
Description,
Disabled
) VALUES (
1,
'Sql',
'GetSiteList',
'{"Api":true}',
'SELECT SiteId, Title FROM Sites WHERE TenantId = @TenantId ORDER BY SiteId',
'サイト一覧を取得する拡張SQL',
0
);
この拡張 SQL は /api/extended/sql エンドポイントから呼び出せます。
POST /api/extended/sql
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key",
"Name": "GetSiteList"
}
Extensions API を使用する
Extensions テーブルのレコードを API 経由で CRUD 操作することもできます。
前提条件
Extensions API を使用するには以下の条件を満たす必要があります。
- テナント管理画面で「Extensions API を許可する」を有効化
- API キー認証
- 特権ユーザーであること
API エンドポイント
| 操作 | メソッド | エンドポイント |
|---|---|---|
| 全件取得 | POST | /api/extensions/get |
| 個別取得 | POST | /api/extensions/{id}/get |
| 作成 | POST | /api/extensions/create |
| 更新 | POST | /api/extensions/{id}/update |
| 削除 | POST | /api/extensions/{id}/delete |
全件取得リクエスト(Get)
テナント内の Extension レコードを取得します。
POST /api/extensions/get
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key"
}
レスポンス例:
{
"StatusCode": 200,
"Response": {
"Data": [
{
"ApiVersion": 1.1,
"ExtensionId": 1,
"TenantId": 1,
"Ver": 1,
"ExtensionType": "Script",
"ExtensionName": "MyCustomScript",
"ExtensionSettings": "{\"SiteIdList\":[12345]}",
"Body": "console.log('Hello');",
"Description": "カスタムスクリプト",
"Disabled": false,
"Creator": 1,
"Updator": 1,
"CreatedTime": "2026-02-19T10:00:00",
"UpdatedTime": "2026-02-19T10:00:00"
}
]
}
}
個別取得リクエスト(Get)
特定の ExtensionId を指定して1件取得します。
POST /api/extensions/1/get
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key"
}
作成リクエスト(Create)
新しい Extension レコードを作成します。
POST /api/extensions/create
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key",
"ExtensionType": "Script",
"ExtensionName": "MyNewScript",
"ExtensionSettings": {
"SiteIdList": [12345],
"Actions": ["Edit"]
},
"Body": "console.log('Hello from Extensions API');",
"Description": "API経由で作成したスクリプト",
"Disabled": false
}
レスポンス例:
{
"Id": 2,
"StatusCode": 200,
"Message": "MyNewScript を作成しました。"
}
更新リクエスト(Update)
既存の Extension レコードを更新します。URL に ExtensionId を指定します。
POST /api/extensions/1/update
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key",
"Body": "console.log('Updated script');",
"Description": "更新されたスクリプト",
"Disabled": false
}
更新リクエストでは、変更するフィールドのみを指定できます。指定しなかったフィールドは既存の値が維持されます。
レスポンス例:
{
"Id": 1,
"StatusCode": 200,
"Message": "MyNewScript を更新しました。"
}
削除リクエスト(Delete)
Extension レコードを削除します。
POST /api/extensions/1/delete
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key"
}
レスポンス例:
{
"Id": 1,
"StatusCode": 200,
"Message": "MyNewScript を削除しました。"
}
エラーレスポンス
権限不足や不正なリクエストの場合、以下のようなエラーレスポンスが返されます。
{
"StatusCode": 403,
"Message": "この操作を行う権限がありません。"
}
| StatusCode | 説明 |
|---|---|
| 200 | 成功 |
| 400 | 不正なリクエスト(JSON 形式エラー等) |
| 403 | 権限不足(特権ユーザーでない、API 許可されていない等) |
| 404 | 指定した ExtensionId が存在しない |
View によるフィルタリング
全件取得リクエストで View を指定すると、条件に合致するレコードのみを取得できます。
POST /api/extensions/get
{
"ApiVersion": 1.1,
"ApiKey": "your-api-key",
"View": {
"ColumnFilterHash": {
"ExtensionType": "Script"
}
}
}
ファイルベースの設定との関係
Extensions テーブルのレコードと App_Data/Parameters/ExtendedXxx/ フォルダのファイルは共存します。
| 管理方法 | 設定場所 | 登録タイミング |
|---|---|---|
| ファイル | App_Data/Parameters/ExtendedXxx/*.json |
アプリ起動時に読込 |
| データベース | Extensions テーブル | アプリ起動時に読込 |
両方に設定がある場合、それぞれが独立してリストに追加されます。同名の拡張が存在する場合は両方とも適用されるため、意図しない重複に注意してください。
Extensions テーブルの設定変更を反映するには、アプリケーションの再起動またはパラメータリロードが必要です。
Web 経由でのパラメータリロード
アプリケーションを再起動せずに Extensions テーブルの設定変更を反映するには、特権ユーザーでログインした状態で以下の URL にアクセスします。
https://{プリザンターのURL}/admins/reloadparameters
成功すると空白のページが表示され、Extensions テーブルを含むパラメータが再読み込みされます。
パラメータリロード機能の詳細や、ナビゲーションメニューへの追加方法については、以下の記事を参照してください。
プリザンターでパラメータリロードを簡単に実現する方法
マルチクラスタ環境での活用
マルチクラスタ環境や Kubernetes 等のコンテナ環境では、Extensions テーブルを使用するメリットが大きくなります。
| 観点 | ファイルベース | データベース(Extensions テーブル) |
|---|---|---|
| 設定の配布 | 各インスタンスにファイルを配置する必要あり | データベースを共有すれば自動的に同期 |
| 設定変更の反映 | 各インスタンスでファイルを更新&再起動 | DBを更新して各インスタンスを再起動 |
| バージョン管理 | Git などで管理 | DB レコードとして管理(履歴は別途必要) |
| 運用自動化 | デプロイツールとの連携が必要 | API 経由で設定変更が可能 |
まとめ
- Extensions テーブルを使用すると、拡張機能をデータベースで一元管理できる
- マルチクラスタ環境では、ファイル配布の手間を省ける
- API 経由での CRUD 操作が可能なため、運用自動化に対応できる
- ファイルベースの設定と共存可能だが、重複に注意