1

对于我们的 ASP.NET 应用程序,我们使用 C# 控制台应用程序来维护我们的 Oracle 和 SQLServer 数据库。单个脚本按数字顺序加载和运行(脚本名称有数字),并在脚本完成时提交。

这是一个遗留应用程序,我们将来会远离这种格式,但是现在我们需要尽可能少地修改它来维护它。

最近,我们在 DB_VERSION 表中添加了两列:APP_MAJOR 和 APP_MINOR。这一添加是在我们的一个脚本中完成的,目的是让我们能够跟踪数据库最后更新到的产品版本。

当每个脚本完成执行并提交(使用 IDbContext 和 IDbTransaction)时,应用程序会使用应用程序的主要/次要版本以及脚本的编号更新 DB_VERSION 表。在添加主要/次要列之前,应用程序刚刚更新了脚本编号。

在 SQLServer 中,完全没有问题 - 当应用程序完成时,DB_VERSION 表正确地指示了应用程序的版本。但是,在 Oracle 中,APP_MAJOR 和 APP_MINOR 列永远不会更新。

我已将此跟踪到我们使用的查询,该查询验证表是否为新列 - 即使在脚本执行完成后,新列也没有显示。似乎 Oracle 正在缓存以前的查询,因此永远不会使新列可用于更新(尽管始终更新的 Version 列会继续正确更新)。

我们尝试手动关闭连接,完全终止上下文并放置 5 秒等待期以允许池过期(我知道,我知道),更改脚本本身的结构以使用直接 DDL - 一切都无济于事. 由于权限错误,添加清除 Oracle 缓存的语句也失败了。

我会把代码放在这里供您查看,但是有太多地方可能会出现问题 - 我希望有人可以为我们提供一个大致的方向。

提前致谢!

4

0 回答 0