Как переименовать столбец, который является индексом?

#sql #db2

#sql #db2

Вопрос:

Я хочу переименовать столбец таблицы, но это индекс, поэтому я получаю сообщение об ошибке. Как мне решить эту проблему?

 ALTER TABLE <name> RENAME column <id> TO <newid>;
  

Error: SQL0478N DROP, ALTER, TRANSFER OWNERSHIP...

Комментарии:

1. Пожалуйста, покажите ваш код и ошибку.

Ответ №1:

В командной строке командной оболочки вы можете использовать db2 "? SQL0478N" | more , чтобы просмотреть подробную информацию об ошибке и некоторые предложения.

Ошибка сообщает вам, что объект, который вы хотите изменить, имеет зависимые объекты, поэтому, пока вы не обработаете зависимости, вы не сможете выполнить действие alter.

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

Если вы хотите сделать это вручную, вам нужно найти зависимые объекты, удалить их, переименовать столбец (ы), затем воссоздать зависимости. Могут быть и другие зависимые объекты, не только индекс, такие как пакеты. Если ваш Db2-сервер работает в Linux / Unix / Windows, вы можете использовать хранимую процедуру DBMS_UTILITY.GET_DEPENDENCY , или вы можете запросить каталог вручную. Это зависит от того, что для вас проще.

Воссоздание зависимостей может быть инвазивным, и если существуют объекты static-SQL, которые ссылаются на соответствующие индексы, то их потребуется восстановить. Для производственного использования это может привести к отключению сервиса, которого вы хотите избежать.

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

Если вы хотите попробовать автоматизацию, и если ваш Db2-сервер работает в Linux / Unix / Windows, тогда вы можете использовать хранимую процедуру SYSPROC.ALTOBJ — однако существует кривая обучения, и это подходит не для всех эволюций схемы.

Ответ №2:

Решение:

 drop index
alter table
create index