SQL, Как изменить столбец в таблице SQL, не нарушая других зависимостей? - PullRequest
5 голосов
/ 21 июня 2010

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

Вот мой вопрос:

У меня есть таблица с именем Контакты с колонкой varchar Заголовок .Сейчас, в середине разработки, я хочу заменить поле Title на TitleID , которое является внешним ключом таблицы ContactTitles .На данный момент таблица Контакты имеет более 60 зависимостей (другие таблицы, функции представлений).

Как сделать это самым безопасным и простым способом?

Мы используем: MSSQL2005, данные уже перенесены, просто хочу изменить схему.

Редактировать:

Спасибо всем за быстрое воспроизведение.

Как это былоупомянутая таблица Contacts имеет более 60 зависимых элементов, но при выполнении следующего запроса только 5 из них используют столбец Title .Сценарий миграции был запущен, поэтому никаких изменений данных не требуется.

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

Затем я просмотрел эти 5 представлений и обновил их вручную.

Ответы [ 4 ]

3 голосов
/ 21 июня 2010

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

Если данные будут меняться, вам следует быть осторожным и убедиться, что любые изменения в столбце Title также изменят таблицу ContactTitles. Вам нужно будет только синхронизировать их во время рефакторинга.

Редактировать: Есть даже книга об этом! Рефакторинг баз данных .

2 голосов
/ 21 июня 2010

Как отмечали другие, это зависит от вашей РСУБД.

Существует два подхода:

  • внести изменения в таблицу и исправить все зависимости
  • создайте представление, которое вы можете использовать вместо прямого доступа к таблице (это может защитить вас от будущих изменений в базовой базовой таблице (таблицах), но вы можете потерять некоторые функции обновления, в зависимости от вашей СУБД)
1 голос
/ 21 июня 2010

Для Microsoft SQL Server Redgate есть (не бесплатный) продукт, который может помочь с этим рефакторингом http://www.red -gate.com / products / sql_refactor / index.htm

В прошлом мне удавалось сделать это довольно легко (примитивно), просто получив список вещей для обзора

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(и, возможно, учет информации о зависимостях и фильтрация по типу объекта)

Сценарий всех интересующих вас задач в Management Studio, затем просто спуститься по списку, просмотреть их все и изменить CREATE на ALTER. Это должно быть довольно простое и повторяющееся изменение даже для 60 возможных зависимостей. Кроме того, если вы ссылаетесь на несуществующий столбец, вы должны получить сообщение об ошибке при запуске сценария для ALTER.

Если вы используете * в своих запросах или используете SQL в своих приложениях, очевидно, что все может быть немного сложнее.

0 голосов
/ 21 июня 2010

Используйте SP_Depend 'Table Name', чтобы проверить зависимости таблицы а затем используйте SP_Rename для переименования имени столбца, что очень полезно. sp_rename автоматически переименовывает связанный индекс всякий раз, когда ограничение PRIMARY KEY или UNIQUE переименовывается. Если переименованный индекс привязан к ограничению PRIMARY KEY, ограничение PRIMARY KEY также автоматически переименовывается в sp_rename.

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

...