Переименование таблиц SQL Server, каскадное изменение которых происходит через PK и FK

StackOverflow https://stackoverflow.com/questions/191787

  •  08-07-2019
  •  | 
  •  

Вопрос

Я хочу найти команду sql или что-то, что может сделать это, где у меня есть таблица с именем tblFoo, и я хочу назвать ее tblFooBar. Однако я хочу, чтобы первичный ключ также был изменен, например, в настоящее время это так:

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

И я хочу изменить имя, чтобы изменить его на:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

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

CHECK ADD  CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])

На это:

 CHECK ADD  CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])

Естественно, я стараюсь не проходить и делать все это вручную, потому что a) это подверженный ошибкам процесс, и b) он не масштабируется.

Это было полезно?

Решение

Это просто не в моей голове и не завершено (вам нужно добавить аналогичный код для индексов). Кроме того, вам нужно будет либо добавить код, чтобы избежать переименования объектов из таблицы с тем же базовым именем, но с дополнительными символами - например, этот код также будет перечислять tblFoo2 и все связанные с ним объекты. Надеюсь, это начало для вас.

DECLARE
    @old_name   VARCHAR(100),
    @new_name   VARCHAR(100)

SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'

SELECT
    'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'

Другие советы

Хороший ответ от Тома
Я только что расширил его запрос, чтобы включить индексы

declare
 @old nvarchar(100),
 @new nvarchar(100)

set @old = 'OldName'
set @new = 'NewName'

select 'EXEC sp_rename ''' + name + ''', ''' + 
  REPLACE(name, @old, @new) + ''''
 from sys.objects 
 where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name)  +  ''', ''' +
  REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
  from sys.objects 
   left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
  where sys.indexes.name like '%' + @old + '%'

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

Большой поклонник: -)

SQL Server не будет делать это напрямую, насколько мне известно. Вы должны были бы вручную собрать сценарий, чтобы внести изменения. Это может быть достигнуто путем генерации SQL для определения таблицы (SSMS сделает это) и выполнения поиска и замены по именам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top