У меня есть таблица на 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 или в первую очередь предлагают создать таблицу по-другому, бесполезны, поскольку они здесь неприменимы...)