Microsoft Accesss(以下Access)で作成されたツールをSQL Serverにアップサイジングすると、データ登録の際にデータの競合エラーが発生する場合があります。
現在私は古いOfficeアプリケーションのWindows10移行作業を進めており、その中でMDBファイルでのデータ管理をSQL Serverでの統合管理に移行する作業も行っております。
単純にデータテーブルをSQL Serverに移行するだけという作業も多いのですが、動かしてみるといろいろとエラーが発生することも多いです。
これはAccessのSQLとSQL ServerのSQLの違いが多いのですが、一番困るのが「データ競合エラー」です。
※ 「データ競合エラー」 で一番多いのは「bit型」。
※Nullデータ許容を外し、初期値として「false(0)」等を設定するというのはお約束。
「データ競合エラー」 が発生しやすいケースは、テーブルのレコード情報がフォームに連携された「データ連結フォーム」で、データ登録時にVBAなどで処理を追加している場合です。
複数のデータ更新処理が同時に一つのレコードに対し発生した場合に 「データ競合エラー」 が発生します。
イベントの発生順に処理を追っていって見つけられる場合もあるのですが、複雑な処理の場合やサブフォームとの連携がある場合など、エラーの特定ができないことも多く困った状態になってしまいます。
(Accessはレコードの移動があると自動でデータの更新処理が行われます。これと同時にVBAによるデータの更新処理が行われると「データの競合」が発生したと判断されます。)
(自分で作ったツールではないので、ユーザーに運用や動作など確認が必要な場合もあり、なかなか作業がはかどりません。)
これを解決する手段として、私は非連結フォーム化(フォームのレコードソースを削除)し、「登録」「更新」ボタンが押されたときにSQLを発行してデータの登録・更新を行うよう処理を変更してます。
登録・更新の処理が1か所にまとまるので、これでほぼ解決します。
元々Accessでは普通に用いられている連結フォームですが、SQL Serverのようにデータの変更を厳密に管理するようなデータベースには向いていないようです。
Accessはあまりプログラミングに詳しくないユーザーを囲うために、かなりファジーに動作するようになっているのかもしれませんね。