代码之家  ›  专栏  ›  技术社区  ›  jwl

如何在具有约束的iSeries上更改表?获取“*文件正在使用。”错误

  •  1
  • jwl  · 技术社区  · 15 年前

    我在iSeries(IBM-I/AS400)上有一个表,它有一些限制。该表是用类似SQL的方式创建的,有一些外键从其他表链接到该表(实际的SQL在这里有点模糊):

    CREATE TABLE ABCLIB.ABCDE (
      DEIDN INTEGER NOT NULL WITH DEFAULT, 
      DETTL VARGRAPHIC (50) ALLOCATE(25), 
      DETYP CHAR (1) NOT NULL WITH DEFAULT);
    
    ALTER TABLE ABCLIB.ABCDE ADD PRIMARY KEY (DEIDN);
    
    ALTER TABLE ABCLIB.ABCFG ADD FOREIGN KEY (FGDEK) 
      REFERENCES ABCLIB.ABCDE (DEIDN) 
      ON DELETE RESTRICT ON UPDATE RESTRICT;
    
    ALTER TABLE ABCLIB.ABCHI ADD FOREIGN KEY (HIDEK) 
      REFERENCES ABCLIB.ABCDE (DEIDN) 
      ON DELETE RESTRICT ON UPDATE RESTRICT;
    

    现在,很久以后,我将需要更改该表以添加字段:

    ALTER TABLE ABCLIB.ABCDE ADD COLUMN DEICN VARGRAPHIC (100) ALLOCATE(50)     
    

    导致此消息:

    Row or object ABCDE in ABCLIB type *FILE in use.
    

    我已经检查过了,现在这个表上肯定没有对象锁。当我查看作业日志时,我看到:

    Constraint cannot be removed from file Q_AT000000.    
    Constraint(s) not removed from file Q_AT000000.       
    File ABCDE in ABCLIB not changed.                 
    Row or object ABCDE in ABCLIB type *FILE in use.  
    

    现在,我当然可以删除并重新添加所讨论的约束,但我觉得这不应该是必要的。我要添加的列与约束无关。我认为这可能是因为事实上OS400(i5/OS)并没有真正改变现有的表,而是创建了一个新表并在其中复制数据,这可能就是造成这种痛苦的原因。

    但是,是否有一种方法可以挂起这些键,然后在更改之后恢复它们?

    (不涉及使用SQL执行此操作或建议首先以不同方式创建表的答案没有帮助,因为它们在此处不适用…)

    2 回复  |  直到 15 年前
        1
  •  4
  •   jwl    15 年前

    答案是:我错过了这样一个事实:其中一个表上有一个锁,它有一个外键指向该表。或者,更直截了当地说:我是个白痴!

        2
  •  0
  •   Will A    15 年前