SPIRAL v1において、同じDBを複数のフォーム(ユーザー用フォームと管理者用フォームなど)から編集できる場合に、 「開きっぱなしのフォーム送信」などによるステータス不整合を防ぐ方法についてお伺いします。 対象のDBには「ステータス」という選択フィールドがあり、例えば以下のような運用を想定しています: ①ユーザーがレコードを登録する(ステータス:審査前) ②ユーザーがレコードを修正する(ステータス:審査前) ③管理者が同じレコードを開いて審査する(ステータス:審査前) ④管理者が審査結果に基づいて更新する(ステータス:審査済み) この場合、③の最中にユーザーが②を行ったり、④が完了しているにもかかわらずユーザーが開きっぱなしのフォームから②を行ってしまうと、ステータスが不整合になる懸念があります。 対応例として、ユーザー側の画面では「下書き → 審査待ち」といったステータス遷移を行い、 審査待ち状態のレコードの単票からは編集フォームへ遷移できないようにすれば、ある程度は防げそうです。 しかしこの方法では、開きっぱなしの更新フォームや申請提出フォームを複数タブで開いた場合などの不整合は防ぎきれません。 そこで質問です: DBへの登録時に、更新前レコードのステータスが特定の値でなければ更新を拒否する、といった「楽観ロック」に近い仕組みはSPIRAL v1で実現可能でしょうか? 可能であれば、API呼び出しを利用しない方法を知りたいです。
コメント
ナレッジ
向上チーム
ご質問ありがとうございます。 >更新前レコードのステータスが特定の値でなければ更新を拒否する、といった「楽観ロック」に近い仕組みはSPIRAL v1で実現可能でしょうか? ユーザーが更新を行うためのTRDBを別途作成いただき、下記の処理を実装いただければ、 管理者がステータスを「審査済」に変更した後にユーザー更新フォームから値が送信されても、DBが更新されずエラー終了となります。 実装手順 1.TRDBで更新用のフォームを作成し、「ステータス」を固定値「申請前」で設定してください。 2.TRDBのトリガにて下記の順番でトリガが発動されるように設定してください。 ・ルックアップトリガ:登録フィールドにて通常DBからTRDBにステータス値がコピーされるように設定。 ・演算トリガ1:演算結果格納フィールド「エラー終了」を追加し、条件式「ステータス = 審査済」と設定。 ・演算トリガ2:演算結果格納フィールド「ステータス」にて、値が「審査前」の時に「審査前」がレコードに格納されるように設定。 3.TRDBの更新のアクションでステータスを含むフォームで入力してもらった項目をマッピングしてTRDBに登録されるとDBを更新されるように設定する。 上記の手順にて、ステータスが「審査済」のユーザーからの更新はエラー終了となり、「審査済」以外の場合は通常通り更新されます。 また、管理者が「審査済」のレコードを再操作する場合は、TRDBからではなく、通常DBから直接操作をお願いいたします。 サポートサイトにTRDBについての記載されておりますので、ご確認をお願いします。 ▼サポートサイト:トランザクションDB https://support.smp.ne.jp/manuals/transaction/ ご確認をよろしくお願いいたします。