ASP.NET アプリケーションでは、C# コンソール アプリケーションを使用して、Oracle データベースと SQLServer データベースを維持します。個々のスクリプトが読み込まれ、番号順に実行され (スクリプト名には番号が付けられます)、スクリプトが完了するとコミットされます。
これはレガシー アプリケーションであり、将来的にはこの形式から移行する予定ですが、現時点ではできるだけ変更を加えずに維持する必要があります。
最近、DB_VERSION テーブルに APP_MAJOR と APP_MINOR の 2 つの列を追加しました。この追加は、データベースが最後に更新された製品のリリースを追跡できるようにする目的で、スクリプトの 1 つで行われました。
各スクリプトの実行が完了し、(IDbContext と IDbTransaction を使用して) コミットされると、アプリケーションはアプリケーションのメジャー/マイナー バージョンとスクリプトの番号で DB_VERSION テーブルを更新します。メジャー/マイナー列を追加する前に、アプリケーションはスクリプト番号を更新しました。
SQLServer では、まったく問題はありません。アプリケーションが完了すると、DB_VERSION テーブルはアプリのバージョンを正しく示します。ただし、Oracle では、APP_MAJOR 列と APP_MINOR 列は更新されません。
これを、テーブルが新しい列であるかどうかを確認するために使用するクエリまで追跡しました。スクリプトの実行が完了した後でも、新しい列は表示されません。Oracle は以前のクエリをキャッシュしているように見えるため、新しい列を更新できるようにすることはありません (ただし、常に更新されていたバージョン列は適切に更新され続けます)。
手動で接続を閉じ、コンテキストを完全に終了し、プールが期限切れになるまで 5 秒間待機して (わかっています、わかっています)、スクリプト自体の構造を変更してストレート DDL を使用するようにしましたが、すべて無駄でした。 . 権限エラーのため、Oracle キャッシュをクリアするステートメントの追加も失敗しました。
レビュー用にコードをここに置きますが、問題が発生する可能性のある場所が多すぎます - 誰かが私たちが取るべき一般的な方向性を提供してくれることを願っています.
前もって感謝します!