項目ロックの解除
プリザンターのロック機能は 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 を実行します。
関連ページ
- 拡張 SQL の活用
- Extensions テーブルで拡張機能を DB 管理(API 実行可能な拡張 SQL の DB 登録例あり)