我有一个奇怪的业务需求,让我难倒了。一些背景:基本上,我有两张用于跟踪程序增强的表格:增强和Bug。 Enhancement-> Bug的关系是1:m,Bug表有一个外键列EnhancementID。数据库设计:基于另一个表的状态
这两个表都有一个“状态”列,但这是棘手的地方。我的要求是增强的状态取决于其相关的错误。例如,如果我们有3个增强ID为100的错误和“正在测试”状态,则增强100的状态应该自动设置为“正在测试”。有几个这样的状态规则。
这个数据库由几个应用程序共享,所以我的第一个想法是在Bug表上使用“On Update”触发器。因为触发器在触发表中有Select语句,所以我收到了一个“mutating table”错误(当触发器触发时,我必须查询具有指定EnhancementID的所有错误的状态)。现在,我试图实现一个三触发器解决方案,如下所示:http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936但我越来越担心在数据库触发器中放置如此多的逻辑。
所以我的问题是:我是否合理地接近这个问题?有人可以建议更好的方法吗?也许使用增强状态的视图?
我实际上是根据Tom Kyte提供的解决方案中的建议来构建触发器。另一个问题是,我无法真正改变应用程序以使用当前增强表中的不同表格。根据这个视图是否可以更新增强表的状态? – user2811300
所以你正试图解决带有触发器的应用程序,那一定是......不愉快!你可以重新命名你的表格并调用视图“增强”,但这可能会引发更多的问题。实际上,如果您无法控制应用程序,意想不到的后果将很难预测。 –
同意@VincentMalgrat - 如果可以,请使用视图。除非你有某种形式的锁定(建议的基于触发器的解决方法没有),基于触发器的方法无法正常工作 - 基本问题是触发器无法“看见”其他事务所做的更改(如添加或更新状态为“正在测试”的另一个错误)。 –