SQL, Как изменить столбец в таблице SQL, не повреждая другие зависимости?

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

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

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

Как я могу сделать это самый безопасный и самый легкий путь?

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

Править:

Благодаря Всем для быстрого воспроизведения.

Как он была упомянутая таблица контактов, имеет более чем 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 представлений и обновил их вручную.

5
задан cinek 21 June 2010 в 13:54
поделиться

4 ответа

Для 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 в своих приложениях, все может быть немного сложнее.

1
ответ дан 14 December 2019 в 13:26
поделиться

Как отмечали другие, это зависит от вашей RDBMS.

Есть два подхода:

  • внести изменения в таблицу и исправить все зависимости
  • создать представление, которое можно использовать вместо прямого доступа к таблице (это может защитить вас от будущих изменений в основной таблице (таблицах), но вы можете потерять некоторую функциональность обновления, в зависимости от вашей СУБД)
2
ответ дан 14 December 2019 в 13:26
поделиться

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

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

Редактировать: Об этом даже есть книга! Refactoring Databases.

3
ответ дан 14 December 2019 в 13:26
поделиться

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

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

0
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: