Rebatizar tabelas SQL Server, em cascata que a mudança através de PK e FK
-
08-07-2019 - |
Pergunta
Eu quero encontrar um comando SQL ou algo que pode fazer isso onde eu tenho uma tabela chamada tblFoo e quero nomeá-lo tblFooBar. No entanto, eu quero a chave primária para ser também a mudança, por exemplo, atualmente é:
CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED
E eu quero uma mudança de nome para alterá-lo para:
CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED
Então, recursivamente percorrer e cascata esta mudança em todas as tabelas que possuem uma relação de chave foreigh, por exemplo. a partir deste:
CHECK ADD CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])
Para isto:
CHECK ADD CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])
Naturalmente, estou tentando não passar e fazer tudo isso manualmente, porque a) é um processo propenso erro, e b) ele não escala.
Solução
Este é apenas fora do topo da minha cabeça e não está completa (você precisa adicionar código semelhante para os índices). Além disso, você precisa se quer código add para evitar renomear objetos de uma tabela com o mesmo nome base, mas caracteres adicionais - por exemplo, este código também lista tblFoo2 e todos os seus objetos associados. Esperemos que isso é um começo para você embora.
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 + '%'
Outras dicas
Boa resposta por Tom
Acabei estendeu sua consulta aqui para incluir índices
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 + '%'
Uma grande ferramenta que tira a dor de tabelas renomeação é Red Gate SQL Refactor Ele vai encontrar automaticamente a sua dependência do e trabalhar tudo isso para você também.
Grande fã: -)
SQL Server não vai fazer isso diretamente, tanto quanto eu estou ciente. Você teria que construir manualmente o script para fazer a mudança. Isto pode ser conseguido através da geração do SQL para a definição da tabela (SSMS vai fazer isso) e fazer uma pesquisa e substituir sobre os nomes.