db2 - 在不使用文件级检查编译 RPG 的情况下确保数据完整性的某种方法?
问题描述
我们团队中的一些成员编写/维护 RPG 程序——他们共享一个 db2 数据库,由日志表和非日志表组成。
如果我们使用 level-check 进行编译,那么即使我们只是向表中添加一个新列,那么任何使用该表的 RPG 程序都会引发运行时错误。
如果我们在没有级别检查的情况下进行编译,那么如果 RPG 程序正在使用非日志表,并且我们从其中一个表中删除相关列,那么 RPG 程序可能会插入到非日志表中,然后无法插入到第二个(修改过的)表,从而留下孤立的数据(因为我们不能使用事务,因为表没有记录)。
我们想要的是在仅添加列(或增加列的大小等)时不必重新编译任何内容 - 但不会冒数据完整性的风险。
我们有什么办法可以做到这一点?
解决方案
我们想要的是在仅添加列(或增加列的大小等)时不必重新编译任何内容 - 但不会冒数据完整性的风险。
添加一列很容易,更改大小是另一回事......
您需要一个将 RPG 程序与物理数据布局分开的层。
只需做两件事
- 使用显式格式定义所有 LF
- 让所有 RPG 程序都通过 LF 访问,而不是通过 PF 访问。
所以你可能有
A* My Physical file
A UNIQUE
A R MYPFR
A MYKEY 3A COLHDG('Key Field')
A FLD1 10A COLHDG('field 1')
A FLD2 15A COLHDG('field 2')
A FLD3 20A COLHDG('field 3')
A K MYKEY
在您的逻辑中,明确列出包含的字段...
A UNIQUE
A R MYLFR PFILE(MYPF)
A MYKEY
A FLD1
A FLD2
A FLD3
A K FLD1
您不想要的是自动神奇地使用 PF 格式的 LF。
A UNIQUE
A R MYLFR PFILE(MYPF)
A K FLD1
现在,当您向 PF 添加一列时,只需保持所有现有 LF 不变。因此,它们的格式不会改变,即使打开了关卡检查,您也不需要重新编译任何 RPG 程序。
您可以定义包含新列的新 LF,以供需要访问新列的任何 RPG 程序使用。
是的,你最终会得到更多的逻辑加班。但只要“新”逻辑使用与现有密钥相同的密钥,除了几个字节的磁盘空间外,它不会占用任何资源。由于“新”逻辑将使用现有的访问路径。存储/维护访问路径是占用 i 资源的原因。
迁移到这个设置也不是那么难。
- 使用新名称构建新 PF
- 使用现有的 PF 名称创建一个新的 LF
- 更新现有的 LF 以指向新的 PF 并显式列出列。
实际上,您可以在步骤 1 中使用 SQL 而不是 DDS,这允许您使用数据库的一些较新的仅 SQL 功能。
IBM Redbook Modernizing IBM i Applications from the Database to the User Interface and Everything in Between详细介绍了该方法。
但是让应用程序通过 LF 层工作的想法已经存在了很长时间。
更改大小
处理增加字段大小的最佳方法是添加具有较大大小的列的新版本,并使用 DB 触发器使原始小版本和大版本保持同步。当然,您需要决定当一个值被放入较大的列而不能放入较小的列时该怎么做。
推荐阅读
- html - 从 PrimeNG 中的 tabView 中删除边框
- javascript - 从网站调用事件 - 使用 VBA 到 Internet Explorer
- c# - 绑定到 ReactiveUserControl.ViewModel 不会设置 ViewModel
- dart - Dart - 我如何将字符串和整数映射在一起?
- typescript - 有没有办法在不使用数组文字类型表示法的情况下声明一个元组?
- apache-spark - 无法在 Windows 中启动闪亮的 shell
- minitest - 如何模拟参数传递给方法+ minitest
- python - python is instance() - 如何使用内置类以外的类使其值得
- css - 谷歌自动完成与滚动条浮动
- c# - ActionMailer.Net.Mvc.EmailResult - 内联图像不在电子邮件中,如何查看结果电子邮件的 html 正文?