Как переименовать столбец таблицы не нарушая целостности

Переименование столбца таблицы или представления – не самая частая операция, которую приходится проделывать разработчику SQL. Но, когда такая необходимость возникает, то как это сделать легко и без дополнительных усилий?

Сама по себе операция переименования столбца – не сложная. Для переименования столбца TerritoryID в таблице Sales.SalesTerritory на новое название TerID, достаточно выполнить следующий скрипт:

EXECUTE sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';

Проблемы начнутся после, когда вы получите следующее предупреждение:

Caution: Changing any part of an object name could break scripts and stored procedures. (Изменение любой части имени объекта может разрушить скрипты и хранимые процедуры)

Либо даже сообщение такого содержания:

Object ‘Sales.SalesTerritory.TerritoryID’ cannot be renamed because the object participates in enforced dependencies. (Объект “Sales.SalesTerritory.TerritoryID” не может быть переименован, потому что он участвует в принудительных зависимостях)

В каких ситуация могут быть такие последствия?

Предположим, что у вас есть хранимая процедура Sales.vTer, который ссылается на столбец TerritoryID в таблице Sales.SalesTerritory. Процедура sp_rename переименует только колонку TerritoryID в таблице Sales.SalesTerritory, но в процедуре останется упоминание о старом наименовании колонки.

Таким образом, таблица Sales.SalesTerritory будет содержать столбец TerrID, но хранимая процедура будет обращаться к колонке Sales.SalesTerritory.TerritoryID, которой больше не существует. Работоспособность процедуры будет нарушена.

Что такое принудительные зависимости?

Зависимость является принудительной («enforced»), когда ссылающийся объект, привязанный к схеме (schema-bound) выражения. Это сообщение также показывает, что есть другие объекты, которые вы должны удалить и заново создать с новым именем столбца.

Как найти хранимые процедуры и другие объекты, которые будут затронуты переименованием столбца?

В SQL Server Management Studio можно отслеживать зависимости, с помощью просмотра зависимостей – View Dependencies option. Вы сможете получить список зависимостей, но переименовывать вам придётся вручную каждый объект, в котором есть ссылка на столбец.

Чтобы переименовать столбец, используя sp_rename, вам необходимо:

  1. Найти все зависимые объекты, которые ссылаются на столбец таблицы/представления.
  2. Удалить все принудительные зависимости (WITH SCHEMABINDING)
  3. Переименовать столбец, используя sp_rename
  4. Восстановить все зависимости, которые вы удалили на 2-ом шаге
  5. Если вам необходимо переименовать ещё один столбец, то необходимо повторить шаги с 1-ого по 4-ый.

Не самый приятный процесс, который заставляет подумать, прежде чем решить всё-таки переименовать столбцы в таблице.

Как переименовать столбец без особых хлопот?

ApexSQL Search может решить все ваши проблемы, связанные с переименованием столбцов. Это БЕСПЛАТНЫЙ компонент (add-in) для SQL Server Management Studio и для Visual Studio, который умеет находить по заданному тексту объекты базы данных и данные в таблицах и представлениях. Позволяет изменять таблицы, представления, хранимые процедуры, функции, колонны, имена параметров и схем, не нарушая зависимостей и целостности БД, визуализируя все объектные взаимосвязи.

  1. Запустите Open SQL Server Management Studio или Visual Studio.
  2. В Object Explorer/Server Explorer, перейдите к таблице или представлению, чьи колонки вы хотите переименовать.
  3. Щелкните правой кнопкой мыши на столбце и выберите Safe rename в меню ApexSQL Search:

  4. Чтобы увидеть изменения, которые будут выполняться, нажмите кнопку Generate preview в окне Safe rename column.
  5. На вкладке Generated script можно увидеть скрипт, который будет выполняться, чтобы переименовать столбец.

  6. Откройте вкладку Warnings, чтобы увидеть информацию о потенциальных проблемах, которые могут встретиться в процессе переименования.

  7. Откройте вкладку Sequence, чтобы увидеть все действия, которые будут выполняться в процессе переименование. Эти действия вам пришлось бы проделать вручную, если бы вы использовали процедуру sp_rename.

  8. Откройте вкладку Dependencies, чтобы увидеть объекты, которые зависят от переименования колонки. Это объекты, которые будут автоматически модифицированны, для сохранения целостности, чтобы не нарушать все ссылки. Если бы вы использовали процедуру sp_rename, вам пришлось бы вручную найти их все и изменить.

  9. Если вы хотите изменить сценарий, прежде чем его выполнить, нажмите кнопку Open. Этот сценарий будет открыт в редакторе SQL Server Management Studio/ Visual Studio.

    После просмотра или модификации вы можете выполнить скрипт Execute или сохранить его в файл.

  10. Для выполнения сценария по переименовании нажмите Rename.

Переименование столбца не тривиальная задача, но вы можете легко её выполнить, если использовать БЕСПЛАТНЫЙ инструмент ApexSQL Search. Вам не потребуется вручную анализировать всю вашу БД на наличие связей и зависимостей. ApexSQL Search всё сделает за вас. Она найдёт все связанные объекты, переименует и пересоздаст все зависимости, чтобы не нарушить целостность базы данных.

Переводчик: Алексей Князев

November 20, 2015