Skip to content

項目ロックの解除 ​

第6版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

プリザンターのロック機能は API からロックすることはできますが、API でロックを解除する方法はありません。確認したソースでは、ロック中のレコードに対する更新はロックしたユーザー本人の API 呼び出しでも LockedRecord エラーになり、Locked: false を送って解除することもできません(ResultValidators.cs)。画面の「ロック解除」は画面用コントローラの UnlockRecord(ItemsController.cs)で処理され、API 用のコントローラには対応する操作がありません。回避策として、ロックを解除する拡張 SQL を用意し、API 経由(またはサーバースクリプト)から実行します。

推奨される方法ではありません

かなりの力業です。履歴が残らないこと、また本来の「ロックしたアカウントまたは特権管理者だけが解除できる」という条件から外れることを理解したうえで使ってください。

拡張 SQL ​

"Api": true にして、API から実行できる拡張 SQL にします。

json
{
    "Name": "UnlockItem",
    "Description": "項目のロックを解除する拡張SQL",
    "Api": true,
    "CommandText": "-- Write an arbitrary SQL statement."
}

SQL ファイル名はいずれも UnlockItem.json.sql です。

sql
UPDATE
    [Results]
SET
    [Locked] = 0,
    [Updator] = @_U, --更新者情報
    [UpdatedTime] = GETDATE() --更新日時のタイムスタンプ
WHERE
    [ResultId] = @ReferenceId
;
UPDATE
    [Issues]
SET
    [Locked] = 0,
    [Updator] = @_U, --更新者情報
    [UpdatedTime] = GETDATE() --更新日時のタイムスタンプ
WHERE
    [IssueId] = @ReferenceId
;
sql
UPDATE
    "Results"
SET
    "Locked" = false,
    "Updator" = @ipU, --更新者情報
    "UpdatedTime" = CURRENT_TIMESTAMP --更新日時のタイムスタンプ
WHERE
    "ResultId" = @ReferenceId
;
UPDATE
    "Issues"
SET
    "Locked" = false,
    "Updator" = @ipU, --更新者情報
    "UpdatedTime" = CURRENT_TIMESTAMP --更新日時のタイムスタンプ
WHERE
    "IssueId" = @ReferenceId
;
sql
UPDATE
    `Results`
SET
    `Locked` = 0,
    `Updator` = @ipU, -- 更新者情報
    `UpdatedTime` = CURRENT_TIMESTAMP(3) -- 更新日時のタイムスタンプ
WHERE
    `ResultId` = @ReferenceId
;
UPDATE
    `Issues`
SET
    `Locked` = 0,
    `Updator` = @ipU, -- 更新者情報
    `UpdatedTime` = CURRENT_TIMESTAMP(3) -- 更新日時のタイムスタンプ
WHERE
    `IssueId` = @ReferenceId
;
  • 更新者に入れるログインユーザーの ID は、拡張 SQL に自動で渡される組み込みパラメータです。接頭辞は DBMS で変わり、SQL Server は @_U、PostgreSQL・MySQL は @ipU です(Parameter.json の SqlParameterPrefix が空の既定のとき。Parameter.cs、SqlIo.cs)。
  • Locked は SQL Server では bit、PostgreSQL では boolean、MySQL では tinyint(1) の列になるため、PostgreSQL だけ false を入れます(PostgreSqlDataTypes.cs、MySqlDataTypes.cs)。現在日時は、プリザンター自身が更新日時に使う書き方にそろえています(SQL Server は getdate()、PostgreSQL は CURRENT_TIMESTAMP、MySQL は CURRENT_TIMESTAMP(3)。SqlServerSqls.cs、PostgreSqlSqls.cs、MySqlSqls.cs)。
  • 記録テーブル(Results)と期限付きテーブル(Issues)の両方に対応するため、2 つの UPDATE を続けて実行しています。どちらの ID も Items テーブルで一意な ReferenceId なので重複せず、このように書けます。
  • 更新者(Updator)と更新日時(UpdatedTime)もあわせて更新しています。

呼び出し方 ​

サーバースクリプトから呼ぶ場合は次のようになります。

js
extendedSql.ExecuteNonQuery(
  'UnlockItem',
  JSON.stringify({
    ReferenceId: 123 // ロックを解除したいレコードの ID(ResultId / IssueId)
  })
);

ReferenceId には解除したいレコードの ID を数値で渡します。

API から呼ぶ場合は、公式マニュアルの拡張 SQL の API 実行の方法で UnlockItem を実行します。

関連ページ ​

変更履歴

第6版記事の確認版を繰り返す表現を整理する
第5版ロック解除の拡張 SQL に PostgreSQL と MySQL の例を追加
第4版本文から元記事や以前の版への言及を除き、正しい動作だけを書く形に整理
第3版「拡張機能」「API」を 1.5.8.1 のソースで検証して修正
第2版記事のファイル名に並び順の番号を付け、元記事リンクを frontmatter の sources に移行
第1版「拡張機能」「API」セクションの記事を追加