Переименование таблиц SQL Server, каскадное изменение которых происходит через PK и FK - PullRequest
5 голосов
/ 10 октября 2008

Я хочу найти команду 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) он не масштабируется.

Ответы [ 4 ]

7 голосов
/ 10 октября 2008

Это просто не в моей голове и не завершено (вам нужно добавить аналогичный код для индексов). Кроме того, вам нужно будет либо добавить код, чтобы избежать переименования объектов из таблицы с тем же базовым именем, но с дополнительными символами - например, этот код также будет перечислять 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 + '%'
5 голосов
/ 18 декабря 2011

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

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 + '%'
3 голосов
/ 10 октября 2008

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

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

1 голос
/ 10 октября 2008

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

...