Столбец перегрузки DB2 400

Я хочу удалить столбец с именем id, который является автоматически увеличивающим PK.

SQL:

alter table "CO88GT"."XGLCTL" drop column id cascade;

И я получаю:

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.

SQLState:  57014

ErrorCode: -952

Я мог ошибаться, но я думаю, что это имеет какое-то отношение к предотвращению потери данных. Чтобы обойти эту проблему, мне нужно создать новую таблицу без столбца и скопировать данные из старой таблицы в новую таблицу, а затем заменить старую таблицу на новую таблицу.

Ответ 1

Информация

AS400 дает вам предупреждение (запрос) из-за возможной потери данных, прося вас отменить или проигнорировать запрошенную операцию. Таким образом, поскольку это является интерактивным запросом, над JDBC/ODBC вы не можете вводить "I" для игнорирования, а AS выдает код ErrorCode: -952 с SQLState: 57014 и код причины 10.

В документации SQL0952 говорится:

Message Text:   Processing of the SQL statement ended. Reason code &1.
Cause Text:     The SQL operation was ended before normal completion. The reason code is &1. Reason codes and their meanings are:

* 1 - An SQLCancel API request has been processed, for example from ODBC.
* 2 - SQL processing was ended by sending an exception.
* 3 - Abnormal termination.
* 4 - Activation group termination.
* 5 - Reclaim activation group or reclaim resources.
* 6 - Process termination.
* 7 - An EXIT function was called.
* 8 - Unhandled exception.
* 9 - A Long Jump was processed.
* 10 - A cancel reply to an inquiry message was received.
* 11 - Open Database File Exit Program (QIBM_QDB_OPEN).
* 0 - Unknown cause.

Если вы используете JDBC, и ошибка SQL не является самоочевидной, вы можете сделать соединение JDBC с параметром errors = full ", что даст гораздо больше информации об ошибке. Для других параметров подключения см. this.

пример строки подключения:

JDBC: as400://имя_сервер, библиотеки = * LIBL, именование = система ошибка = полный

С этим соединением результирующая ошибка будет выглядеть так:

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.
Cause . . . . . :   The SQL operation was ended before normal completion.
The reason code is 10.
Reason codes and their meanings are:
1 -- An SQLCancel API request has been processed, for example from ODBC.
2 -- SQL processing was ended by sending an exception.
3 -- Abnormal termination.
4 -- Activation group termination.
5 -- Reclaim activation group or reclaim resources.
6 -- Process termination.
7 -- An EXIT function was called.
8 -- Unhandled exception.
9 -- A Long Jump was processed.
10 -- A cancel reply to an inquiry message was received.
11 -- Open Database File Exit Program (QIBM_QDB_OPEN).
0 -- Unknown cause.
Recovery  . . . :   If the reason code is 1, a client request was made to cancel SQL processing.  For all other reason codes, see previous messages to determine why SQL processing was ended.

SQLState:  57014
ErrorCode: -952

Решение

Итак, если вы не можете использовать STRSQL, другим решением будет использовать iSeries Navigator, а именно "Run SQL-скрипты" (обычно здесь → "% Program Files%\IBM\Client Access\Shared\cwbundbs.exe" ).

Но прежде всего вам нужно добавить параметр системного ответа (только один раз на машину)

ADDRPYLE SEQNBR (1500) MSGID (CPA32B2) RPY ('I')

Это делается в "зеленом экране". Это задает глухой ответ ('I') в сообщении запроса CPA32B2. CPA32B2 - это внутренний идентификатор массажа, который привязан к операции с колонтитулом.

(Фактически это не нужно делать в "зеленом экране", используйте его как команду CHGJOB. Пример:

cl: ADDRPYLE SEQNBR (1500) MSGID (CPA32B2) RPY ('I');

)

Теперь вы можете запустить "Запуск сценариев SQL", первая команда для запуска:

cl: CHGJOB INQMSGRPY (* SYSRPYL);

это изменяет текущий параметр задания INQMSGRPY на * SYSRPYL. * SYSRPYL вызывает просмотр, существует ли системный параметр ответа, когда должно отображаться сообщение запроса.

Теперь вы можете запустить свой alter, который удаляет столбец.


К сожалению, я не знаю, как удалить столбец, используя JDBC. Если кто-то знает, пожалуйста, дайте мне знать.

Литература:

Ответ 2

Наконец, я нашел решение:

CALL QSYS2.QCMDEXC('ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY(''I'')');
CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)');


ALTER TABLE <tablename> DROP COLUMN <column_name>;                

Ответ 3

Недостаточно информации в сообщении об ошибке, но удаление столбца первичного ключа, как правило, довольно рискованное, и база данных корректно затрудняет работу.

Вероятно, есть ограничение внешнего ключа, связанного с этим столбцом.

Не отбрасывайте ограничение и удаляйте этот столбец, если вы не уверены, что знаете, что делаете.

Ответ 4

В соответствии с этим сообщением: http://bytes.com/topic/db2/answers/185467-drop-column-table

Можно удалить столбец с помощью STRSQL в среде зеленого экрана. У меня есть доступ к этому, и он работает, но у клиента с 400 нет лицензионной программы для использования STRSQL. Проблема в том, что STRSQL подскажет, действительно ли это то, что я действительно хочу сделать.

Чтобы получить данные, я использую SQuirrel SQL-клиент с JT400 JDBC-драйвером... Поэтому я предполагаю, что система, настаивающая на подсказке (и на самом деле без возможности получить приглашение даже без STRSQL), не позволит я делаю это.

Итак, я думаю, что я застрял, делая то, что делаю... создавая новую таблицу и копируя данные, а затем меняя таблицы.

Ответ 5

Единственный способ заставить jdbc работать - сначала вручную изменить значение по умолчанию для этого сообщения. Затем запустите приложение для обновления. В нашем случае мы используем Liquibase. Я мог бы заставить java CommandCall вызывать ADDRPYLE и CHGJOB INQMSGRPY (* SYSRPYL), но он никогда не позволял столбцу alter table * drop * не давать следующую ошибку:

Ошибка:

10 -- A cancel reply to an inquiry message was received.

Рабочая команда:

CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')

Ссылка:

Ответ 6

зеленый экран - STRSQL предоставит вам сообщение об ошибке

alter table devlibsc/trklst drop column "ST"

Смена файла TRKLST может привести к потере данных. (C I)