【问题标题】:db2move importing data in tables with foreign key constraintdb2move 在具有外键约束的表中导入数据
【发布时间】:2021-10-30 02:03:30
【问题描述】:

使用db2look、db2move备份和恢复数据库时如何处理外键约束问题? DDL(使用 db2look 生成)在恢复数据库时创建约束,因此在使用 db2move 导入数据期间发生数据错误。

【问题讨论】:

    标签: database db2


    【解决方案1】:

    您有几个选项可用于填充具有 RI 约束的空 DB2 数据库:

    • 检查数据库中的所有 FK 依赖项并相应地更改 IMPORT 语句的顺序,以防止暂时违反 RI 约束。对于具有自引用外键的表,这可能不是一个选项。
    • 不要通过IMPORT 填充表,而是使用忽略表约束的LOAD 实用程序。 LOAD 会将任何具有约束的目标表(及其下游的依赖表)置于 CHECK PENDING 状态,这将阻止写访问。加载所有表后,对这些表使用 SET INTEGRITY 命令来验证它们是否满足所有约束。
    • 将 DDL 中的 ALTER TABLE 语句重新定位到单独的脚本中,该脚本仅在填充所有表后才会运行。

    【讨论】:

    • 在运行 SET INTEGRITY 命令时,需要考虑表依赖关系 ?我有循环依赖,在这种情况下如何进行?
    • 我猜我发现它“为员工设置完整性,立即检查部门”
    • 尝试运行 'db2move database Load -l backuploc -u user -p pass' 但出现以下错误:'SQLCODE: -3126 - SQLSTATE: SQL3126N 远程客户端需要文件和目录的绝对路径。'
    • 只有一个db2命令可以一步完成ddl和数据复制吗?我认为 db2move 的文档具有误导性 ibm.com/support/knowledgecenter/SSEPGG_11.5.0/… 我相信大多数使用它的人都认为 db2move 完成了完整的副本(例如模式的)。但不是。您必须发出数以千计的命令和选项,并注意到最后并不是您想要的……真的,谁想要数千个包含数据但在 db2move 导入后没有引用的表……失望。
    【解决方案2】:
    1. 首先禁用约束,然后执行 db2move import。
    2. 将数据导入表后,重新启用约束

    ALTER TABLE ALTER FOREIGN KEY NOT Enforced

    然后重新启用:

    ALTER TABLE ALTER FOREIGN KEY ENFOCED

    谢谢, 耐都

    【讨论】:

      【解决方案3】:

      最好在不同的进程中执行表定义和fk约束定义。 为了避免在使用 db2move 工具加载数据时进行完整性检查,fk 定义必须在您执行导入/加载过程之后执行。

      在运行 db2look 转储数据库的 ddl 之后。只需将外键约束分离到单独的文件中。如果其他对象也像触发器、sp 或不同文件上的视图,那就更好了。因此,在加载数据后,立即执行 fk 约束、触发器、sp 和视图。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多