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

8

Какой самый простой и надежный способ переименования таблиц и столбцов базы данных в SQL Server 2008 r2? Мы закончили разработку и по некоторым причинам нам необходимо переименовать некоторые таблицы и несколько столбцов.

Является ли использование синонимов хорошим способом сделать это? К каким подводным камням мы должны быть готовы? Помогает ли это в изящном переименовании колонок?

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

Небо
источник
Намерено ли переименовать эти объекты базы данных и предоставить фасад, чтобы не нужно было модифицировать существующие приложения для использования новых имен объектов?
billinkc

Ответы:

10

Я думаю, что подход зависит от того, являются ли приложения живыми или вы все еще тестируете.

Для таблиц самый безопасный подход - создать синоним с новым именем. Таким образом, вы можете менять приложения по одному (или даже по одной ссылке за раз), не изменяя все сразу. Вам не нужно отбрасывать синоним и переименовывать таблицу до тех пор, пока вы не будете уверены, что все изменения на месте.

CREATE SYNONYM dbo.NewName FOR dbo.OldName;
-- change app to point to dbo.NewName;

-- once all of your changes have been tested:
BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
COMMIT TRANSACTION;

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

CREATE VIEW dbo.vNewName 
AS 
  SELECT Column1, NewColumnName = OldColumnName
    FROM dbo.OldName;

CREATE SYNONYM dbo.NewName FOR dbo.vNewName;

Затем, как и выше, когда вы изменили все ссылки на столбцы и новое имя таблицы, просто:

BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  DROP VIEW dbo.vNewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
  EXEC sp_rename N'dbo.NewName.OldColumnName', N'NewColumnName', N'COLUMN';
COMMIT TRANSACTION;

Если приложение не является активным и все еще проходит тестирование, просто переименуйте столбцы и исправьте то, что ломается после глобального поиска и замены (или интеллектуального рефакторинга с использованием SSDT, RedGate и т. Д.) С помощью кода / процедур приложения и т. Д.

Если приложение работает в режиме реального времени, вам нужно будет действовать более осторожно.

Аарон Бертран
источник
+1 за проверку изменений и исправление того, что сломал подход, за который я получаю дерьмо от своей собственной команды (конечно, только для dev enviro)
RThomas
Спасибо за хороший ответ, но не могли бы вы сообщить мне, что вы имеете в виду: «Таким образом, вы можете изменять приложения по одному (или даже по одной ссылке за раз), не меняя все их сразу. Вы хотите сказать, что мы должны создать синоним по одному, например, сначала таблицу t1, изменить ли код, затем таблицу t2 и т. Д.?
Sky
Сейчас мы находимся на этапе разработки, но система почти готова для того компонента, который эти таблицы должны быть переименованы. Система теперь развернута в UAT.
Sky
1
@Nazila нет, я имею в виду, что вы можете создать синоним для table1 (и один для table2, table3 и т. Д.). Затем вы можете изменить одно приложение, или один класс, или один модуль, или одну хранимую процедуру, чтобы использовать новое имя через синоним. Остальная часть кода может продолжать использовать старое имя. Вы не будете отбрасывать синоним и переименовывать, пока весь код не будет обновлен.
Аарон Бертран
0

Ну, есть много подводных камней, с которыми вы можете столкнуться при изменении названия таблиц и столбцов. Любой другой код SQL или приложения, который их вызывает, должен быть переименован, чтобы соответствовать, или он не будет работать. Redgate делает несколько довольно хороших инструментов, которые могут пройти и внести все изменения в зависимые SQL veiws / functions / sprocs. Самый большой совет, который я могу вам дать, - это сначала выполнить эти изменения в среде DEV и TEST TEST TEST, чтобы убедиться, что вы исправили код везде.

Зейн
источник