0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プリザンターのExtensionsテーブルで拡張機能をDB管理する

0
Last updated at Posted at 2026-02-19

はじめに

プリザンターの拡張機能(拡張スクリプト・拡張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 を使用するには以下の条件を満たす必要があります。

  1. テナント管理画面で「Extensions API を許可する」を有効化
  2. API キー認証
  3. 特権ユーザーであること

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 操作が可能なため、運用自動化に対応できる
  • ファイルベースの設定と共存可能だが、重複に注意

参考リンク

公式ドキュメント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?