プリザンターのサイト管理台帳を作成する

本記事は、[OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/pleasanter) の3日目の記事です。

## 概要
システム管理者向けにプリザンターのサイト管理台帳を作成する方法をご紹介します。運用しているサイト情報を一覧で参照したいときやサイトの棚卸をしたいときのご参考になれば幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/13e3b27f-b9db-9bf3-2af8-4380249ab4ef.png)

### 試した環境
プリザンター 1.4.10.3
OS: Windows11
DB: SQL Server

## 作成手順
### 1. データ取得用クエリの実行

対象の環境にて以下のデータ取得用クエリを実行します。

```sql:サイト管理台帳のデータ取得用
WITH cte AS (
    -- 最上位階層
    SELECT
        [Creator],
        [CreatedTime],
        [SiteId],
        [ReferenceType],
        [Title],
        [Updator],
        [UpdatedTime],
        [ParentId],
        [InheritPermission],
        [Title] AS "fullname",
        1 AS "depth",
        CAST(RIGHT(REPLICATE('0', 10 - LEN(CAST([SiteId] AS VARCHAR))) + CAST([SiteId] AS VARCHAR), 10) AS NVARCHAR(1024)) AS "full_order_no"
    FROM [Sites] WHERE [ParentId] = 0
    AND [TenantId] = 1  -- 対象テナント
    UNION ALL
    -- 子階層
    SELECT
        c.[Creator],
        c.[CreatedTime],
        c.[SiteId],
        c.[ReferenceType],
        c.[Title],
        c.[Updator],
        c.[UpdatedTime],
        c.[ParentId],
        c.[InheritPermission],
        CAST((p."fullname" + ' > ' + c.[Title]) AS NVARCHAR(1024)),
        p."depth" + 1,
        CAST(p."full_order_no" + '/' + RIGHT(REPLICATE('0', 10 - LEN(CAST(c.[SiteId] AS VARCHAR))) + CAST(c.[SiteId] AS VARCHAR), 10) AS NVARCHAR(1024))
    FROM
        [Sites] c
        INNER JOIN cte p ON (p.[SiteId] = c.[ParentId])
    WHERE [TenantId] = 1  -- 対象テナント
)
SELECT
    [Creator] AS "サイトの作成者",
    [CreatedTime] AS "サイトの作成日時",
    [SiteId] AS "対象サイトID",
    [ReferenceType] AS "サイト種別",
    'http://localhost/items/' + CAST([SiteId] AS NVARCHAR(1024)) + '/index' AS "URL",
    [Title] AS "タイトル",
    [Updator] AS "サイトの最終更新者",
    [UpdatedTime] AS "サイトの最終更新日時",
    [ParentId] AS "親サイトID",
    [InheritPermission] "アクセス権の継承",
    REPLICATE(N'□', depth - 1) + N'└' + [Title] AS "ツリー形式",
    "fullname" AS "パンくず形式",
    RIGHT('00' + CAST("depth" AS VARCHAR(2)), 2) AS "サイトの深さ",
    "full_order_no" AS "サイトIDのパス"
FROM cte
ORDER BY full_order_no;
```

:::note warn  
テナントIDとURLのパス（http://<foo>localhost/items/<foo>）は対象の環境に合わせて置換してください。
:::  

クエリ作成にはこちらのブログを参考にさせていただきました。
再帰クエリ、便利ですね！

https://blog.ingage.jp/entry/2023/12/20/182617

以下のような結果が取得できるので、ヘッダ付きのCSV形式で保存します。

#### クエリ実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/ddae42b8-3e75-7eee-faca-fd5f24fc6886.png)

### 2. テーブルへのインポート

あらかじめ用意しておいた「サイト管理台帳」のテーブルにさきほど取得したクエリ結果をインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/13e3b27f-b9db-9bf3-2af8-4380249ab4ef.png)

#### ガイドの内容（設定例）

```
こちらのサイト管理台帳は、以下のような方法でご活用いただけます。
💡一覧画面からURLをクリックすることで対象サイトに遷移することができます。
💡一覧画面からツリー形式やパンくず形式でサイトの配置場所を確認することができます。
💡一覧画面の「検索」からサイト名を検索することができます。
💡一覧画面の「サイトの最終更新者」で「自分」のサイトを絞り込むことができます。
💡一覧画面の「サイトの深さ」から絞り込むことができます。たとえば「01」を選択すると、トップのサイトのみを絞り込むことができます。
💡一覧画面の「サイトIDのパス」にフォルダのサイトID（10桁の先頭ゼロ埋め）を入力すると、フォルダ配下のサイトを絞り込むことができます。
```

#### フィルタの例：サイトの深さ

一覧画面の「サイトの深さ」から絞り込むことができます。たとえば「01」を選択すると、トップのサイトのみを絞り込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/0d7970e5-61a7-d5b7-b53b-269f8ea5e574.png)

#### フィルタの例：サイトIDのパス

一覧画面の「サイトIDのパス」にフォルダのサイトID（10桁の先頭ゼロ埋め）を入力すると、フォルダ配下のサイトを絞り込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/dc7cf09d-609b-15b5-0844-9fcf10378798.png)

:::note info  
検索性が高いので、リンク集のように活用することができます。
:::  

:::note warn
サイト管理台帳をほかのユーザに公開する場合は、個人情報など公開すべきでないサイト情報が含まれていないか事前にチェックしましょう。
:::

## 常に最新の情報がほしい場合は？
日次などのサイクルで定期的に実行されるバッチ処理を作成して上記のSQLをベースとした拡張SQLを実行し、テーブルを更新する案が考えられます（上級者向け）。

https://pleasanter.org/ja/manual/extended-sql

プリザンターの年間サポートサービス（有償）に含まれるOperations Toolsを利用すると、バッチ処理のような開発をすることなく、常に最新の情報を取得することができます。

🎁Operations Toolsのご紹介🎁
https://pleasanter.org/services/OperationsTools

> ④ 「サイト情報一覧」で解決できる課題
> ・利用されていないサイトを簡単に把握し、無駄を省きたい
> ・不要なサイトを効率的に整理し、管理を簡素化したい
> ・放置されたサイトによるシステムリソースの浪費を防ぎ、リソースを有効活用したい

画面イメージ抜粋：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/22d58890-a912-72c0-17d8-7cc7e3fa430c.png)

:::note info  
Operations Toolsでは「サイト情報一覧」画面でレコード最終更新日などの情報が参照できるほか、いくつかの情報をもとに「利用されていない可能性」を自動的に判断してくれます。また、メール通知による「サイト管理者への削除依頼」ができます。
:::  

## おわりに
ノーコード・ローコード開発ツールでは簡単にアプリが作成できる一方で、作成したアプリが運用されずに放置されることがよくあると思います。今回の記事で紹介したSQLやOperations Toolsを活用して、棚卸などのシステム統制に役立てていただければと思います。

## 参考リンク
[- 【SQL】再帰クエリーで組織図を表現 - インゲージ開発者ブログ](https://blog.ingage.jp/entry/2023/12/20/182617)  
[- プリザンター | オープンソースのローコード開発プラットフォーム | Operations Toolsのご紹介](https://pleasanter.org/services/OperationsTools)