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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top