Implem / Implem.Pleasanter

Pleasanter is a no-code/low-code development platform that runs on .NET. You can quickly create business applications with simple operations.
https://pleasanter.org
GNU Affero General Public License v3.0
511 stars 81 forks source link

変更履歴に同じバージョンの行(最新)が複数表示され、データの更新が出来ない。 #466

Closed nozoe closed 1 year ago

nozoe commented 1 year ago

2023/2/28 にCSVからインポートしたデータで、更新履歴を見ると同じバージョンの行が2行表示される事象が発生しています。 この状況だとデータのアップデートも出来ない状況です。

image

MSSQLでエラーになっている時間帯のSyslogsテーブルを確認すると、Results_history に対して重複したキーでレコードの追加を 行っているというエラーがでていました。 image

データを見ると、Results_history テーブルは image になっており、Resultsテーブルimage で、正常なデータのレコードの内容と比較すると本来であれば、ResultsResults_historyVerカラムは、 同値で存在することは無いのでは無いかと思います。 処理的には現在のレコードをResults_history にコピー(Insert)して、Results側のVerカラムを+1しているのでは 無いかと想像しています。(ソースは見ていません) 既にResults_history にVerカラムの値が同値のレコードがあるために更新に失敗しているんだと。

この操作を実施していた頃のPleasanter のバージョンは、私の作業履歴を確認するとVer.1.3.30.1だと思います。 で、このバージョンから現在のバージョン(1.3.36.0)までの履歴を見ると、1.3.35.0 の変更履歴に

・インポート操作で競合が発生した場合にバージョン番号の重複が発生する問題を解消。

というのがありこれを踏んでしまったものだと思います。

で、前置きが長くなりましたがこの問題解消の対策としては、 Results該当するSiteIdをのVerのの値を+1するだけで良いのかどうかの確認です。 迂闊に修正して問題が出たら大変なので…

できれば、一括で修正出来るSQL分があればなお良いのですが…(^_^;)

よろしくお願いします。

uchi-ta commented 1 year ago

貢献ありがとうございます。

ご連絡いただいた問題は1.3.34.0以前のバージョンでインポート時に発生する可能性のある問題です。発生したデータについては、データベースを直接編集して修正する必要がございます。下記の手順で修正していただきますようお願い致します。

  1. リモートデスクトップ等でサーバのデスクトップに接続します。
  2. SQL Server Management Studioを起動します。
  3. 安全のためデータベースのバックアップを取得します。
  4. 下記のSQLを実行して、バージョン番号が重複しないよう修正します。SiteId=99999の部分は、対象のテーブルのサイトIDに変更してください。

--- 期限付きテーブルの場合 update Issues set Ver = (select max(b.Ver)+1 from Issues_history as b where b.IssueId=Issues.IssueId) where IssueId in ( select IssueId from Issues where SiteId=99999 and exists( select * from Issues_history where Issues_history.SiteId = Issues.SiteId and Issues_history.IssueId = Issues.IssueId and Issues_history.Ver = Issues.Ver ));

--- 記録テーブルの場合 update Results set Ver = (select max(b.Ver)+1 from Results_history as b where b.ResultId=Results.ResultId) where ResultId in ( select ResultId from Results where siteid=14393 and exists( select * from Results_history where Results_history.SiteId = Results.SiteId and Results_history.ResultId = Results.ResultId and Results_history.Ver = Results.Ver ));