使用 Oracle 11gR2:
我们已经有一个流程,它通过删除超过指定保留日期的记录(基于记录完成处理时的时间戳与保留日期之间的比较)来清理特定表。我目前正在编写代码,如果此过程失败,它将提醒我的团队。我可以看到这个过程可能失败的唯一方法是如果在它试图清理的特定表上禁用了 DELETE。
我想通过让进程失败来测试警报以确保它们正常工作并且看起来正确。如果我暂时以独占方式锁定表,是否会禁用 DELETE 并导致删除记录的过程失败?还是仅禁用 DDL 操作?有一个更好的方法吗?
使用 Oracle 11gR2:
我们已经有一个流程,它通过删除超过指定保留日期的记录(基于记录完成处理时的时间戳与保留日期之间的比较)来清理特定表。我目前正在编写代码,如果此过程失败,它将提醒我的团队。我可以看到这个过程可能失败的唯一方法是如果在它试图清理的特定表上禁用了 DELETE。
我想通过让进程失败来测试警报以确保它们正常工作并且看起来正确。如果我暂时以独占方式锁定表,是否会禁用 DELETE 并导致删除记录的过程失败?还是仅禁用 DDL 操作?有一个更好的方法吗?
假设“失败”意味着“抛出错误”而不是超出某些性能界限,锁定表将无法完成您想要的。如果您通过SELECT FOR UPDATE
一次会话锁定每一行,您的delete
工作将永远阻塞等待第一个会话释放其锁定。这不会引发错误,也不会导致大多数定义的过程失败。但是,如果您的监控包括运行时间比预期更长的作业的警报,那将很有效。
如果您的监控进程只查看进程是否运行并遇到错误,最简单的选择是在表上放置一个触发器,当有删除时抛出错误。您还可以创建具有外键约束的子表,如果删除尝试在子行存在时删除父行,则会生成错误。根据delete
流程的实现方式,您可能可以设计第二个流程,该流程将为您正在监视的流程产生 ORA-00060 死锁,但这可能比触发器或子表更难实现。