使用 CL As400 命令抑制文件 IO

Posted

技术标签:

【中文标题】使用 CL As400 命令抑制文件 IO【英文标题】:Suppressing File IO using CL As400 command 【发布时间】:2021-03-23 18:24:49 【问题描述】:

我的组织最近委托我修改我们 AS400 系统上的一个大型程序。由于我之前没有使用过系统的这一部分,我想通过调试器运行它以了解它是如何工作的 - 但是我被告知即使在开发环境中运行这个程序也可能导致不需要的数据库更改.

因此,我希望使用 CL 命令来抑制我在培训中遇到的文件 IO。不幸的是,我忘记了它的名称,无法再访问我的培训资源,也无法在网上找到任何东西。我的描述是否与任何已知命令相对应(或者在这种情况下我可能会发现其他任何有用的命令)?

【问题讨论】:

有 OVRDBF INHWRT(*YES) 。我们以前就是这样用的。 谢谢,不胜感激 @RockBoro 你应该添加一个答案。 不需要的更改是什么意思。你是说你的程序即使在开发环境中运行也可以更新生产数据? 不太清楚,我在一个小团队中,我的同事不是一个详细解释的人 【参考方案1】:

OVRDBF 命令的INHWRT 参数,顾名思义,用于禁止将写入、更新和删除实际应用于文件。请注意,如果试图阻止整个应用程序的更新,您必须将覆盖应用到每个文件。如果应用程序写入一个表,然后运行依赖于表中该数据的代码,那么这也将不起作用。

在实践中,我从未见过INHWRT 用于单一用途程序之外的任何用途。

【讨论】:

【参考方案2】:

我认为处理此问题的常用方法是调整库列表,这样您就可以更新不同库中的副本,而不是更新生产文件。如果文件组织得如此糟糕以至于无法做到这一点,您可以列出所有可能受影响的文件,并在程序启动之前将它们覆盖到 QTEMP 副本中。如果程序显式调用包含库名称的文件或表,这将允许您通过文件覆盖机制而不是库来控制它。

阅读您收到的警告的字里行间,我怀疑开发人员不相信文件位置或编码风格的一致性来使用这些技术中的任何一种。您真的应该彻底阅读代码,看看这些技术中的任何一种是否可行,或者是否可能进行更改以使其能够正常工作,以便以适当隔离的方式测试更改。

【讨论】:

【参考方案3】:

如果您的所有物理文件都使用 IMAGES(*BOTH) 进行日志记录,那么数据库中所做的每一次更改都会被记录下来,并且 RMVJRNCHG 可用于返回到程序启动之前。

所以你必须运行一次STRJRNPF ... IMAGES(*BOTH)

在您调用您的程序 CHGJRN ... JRNRCV(*GEN) 之前,它将在新接收器中记录更改

当你想返回之前的状态时,你运行RMVJRNCHG

但请记住

如果您的应用执行 RGZPFM 或 CLRPFM,那么您将无法返回 它只适用于 dabase 文件,不适用于数据区,也不适用于其他对象,也不适用于 ifs 文件 你最好确保你有一个你可以/知道如何实际恢复的备份 你最好是唯一的应用活跃用户 您最好先玩一下 RMVJRNCHG,以了解它的工作原理以及它发送的消息

【讨论】:

如果有人在文件中做任何其他不相关的工作,那也会丢失,然后需要考虑数据一致性问题。我会更关心开发测试可以更新生产数据这一事实。听起来应该先解决这个问题,而不仅仅是用创可贴覆盖。

以上是关于使用 CL As400 命令抑制文件 IO的主要内容,如果未能解决你的问题,请参考以下文章

AS400 - 令牌“!”无效

我可以使用 sql 在 AS400 中创建“逻辑文件”吗?

使用C#调用AS400程序并从QTEMP中选择文件

实现 Java 存储过程 IBM DB2 for i (AS400)

瘦客户端部分用户AS400数据传送无法使用的问题

AS400多成员文件SQL查询