对于我们的ASP.NET应用程序,我们使用C#控制台应用程序来维护我们的Oracle和SQLServer数据库。各个脚本按数字顺序加载和运行(脚本名称具有数字),并在脚本完成时提交。
这是一个遗留应用程序,我们将来会放弃这种格式,但是现在我们需要尽可能少地修改它。
最近,我们在DB_VERSION表中添加了两列:APP_MAJOR和APP_MINOR。这个添加是在我们的一个脚本中完成的,目的是让我们跟踪数据库上次更新的产品版本。
当每个脚本完成执行并提交(使用IDbContext和IDbTransaction)时,应用程序将使用应用程序的主要/次要版本以及脚本编号更新DB_VERSION表。在添加Major / Minor列之前,应用程序刚刚更新了脚本编号。
在SQLServer中,根本没有问题 - 当应用程序完成时,DB_VERSION表正确指示应用程序的版本。但是,在Oracle中,APP_MAJOR和APP_MINOR列永远不会更新。
我已将此跟踪到我们使用的查询,该查询验证表是否为新列 - 甚至在脚本执行完成后,新列也未显示。似乎Oracle正在缓存上一个查询,因此永远不会使新列可用于更新(尽管始终更新的Version列继续正确更新)。
我们尝试手动关闭连接,完全终止上下文并放置5秒等待时间以允许池过期(我知道,我知道),更改脚本本身的结构以使用直接DDL - 所有无济于事。由于权限错误,添加清除Oracle缓存的语句也失败了。
我会把代码放在这里供你审查,但是有太多地方可能存在问题 - 我希望有人能为我们提供一个大方向。
提前致谢!