A melhor maneira de renomear as tabelas após a conclusão do desenvolvimento


8

Qual é a abordagem mais fácil e confiável para renomear as tabelas e colunas do banco de dados no SQL Server 2008 r2? Concluímos o desenvolvimento e, por alguns motivos, precisamos renomear algumas tabelas e algumas colunas.

Usar sinônimos é a melhor maneira de fazer isso? Quais são as armadilhas para as quais devemos estar preparados? Isso ajuda a renomear as colunas também?

Temos muitos scripts relacionados a essas tabelas e eles também são referenciados no aplicativo pelos desenvolvedores .net.


A intenção é renomear esses objetos de banco de dados e fornecer uma fachada para que os aplicativos existentes não precisem ser modificados para usar os novos nomes de objetos?
billinkc

Respostas:


10

Eu acho que a abordagem depende se os aplicativos estão ativos ou se você ainda está testando.

Para tabelas, a abordagem mais segura é criar um sinônimo usando o novo nome. Dessa forma, você pode alterar os aplicativos, um de cada vez (ou mesmo uma referência de cada vez), sem precisar alterar todos eles de uma vez. Você não precisa descartar o sinônimo e renomear a tabela até ter certeza de que possui todas as alterações.

CREATE SYNONYM dbo.NewName FOR dbo.OldName;
-- change app to point to dbo.NewName;

-- once all of your changes have been tested:
BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
COMMIT TRANSACTION;

Para colunas, é um pouco mais complicado. Você pode criar sinônimos que apontam para uma visualização, mas nem todas as visualizações serão necessariamente atualizáveis, dependendo da tabela base. Como um exemplo simples:

CREATE VIEW dbo.vNewName 
AS 
  SELECT Column1, NewColumnName = OldColumnName
    FROM dbo.OldName;

CREATE SYNONYM dbo.NewName FOR dbo.vNewName;

Então, como acima, quando você tiver alterado todas as referências a colunas e o novo nome da tabela, simplesmente:

BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  DROP VIEW dbo.vNewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
  EXEC sp_rename N'dbo.NewName.OldColumnName', N'NewColumnName', N'COLUMN';
COMMIT TRANSACTION;

Se o aplicativo não estiver ativo e ainda estiver passando por testes, renomeie as colunas e corrija o que quebra após uma pesquisa global e substitua (ou refator inteligente usando SSDT, RedGate, etc.) por meio de códigos / procedimentos do aplicativo etc.

Se o aplicativo estiver ativo, será necessário avançar um pouco mais cuidadosamente.


+1 para validar a mudança lo e corrigir o que quebrou abordagem que eu tenho porcaria pois desde a minha própria equipe (dev enviro única é claro)
RThomas

Obrigado pela sua boa resposta, mas você poderia me aconselhar o que você quer dizer com: "Dessa maneira, você pode alterar os aplicativos um por vez (ou mesmo uma referência por vez), sem precisar alterar todos os eles de uma vez. " Você quer dizer que devemos criar o sinônimo um de cada vez, por exemplo, a primeira tabela t1, o código é alterado e a tabela t2, etc?
Sky

Agora estamos na fase de desenvolvimento, mas o sistema está quase completo para o componente que essas tabelas devem ser renomeadas. O sistema agora está implantado no UAT.
Sky

11
@ Nazila não, quero dizer que você pode criar um sinônimo para table1 (e um para table2, table3, etc.). Em seguida, você pode alterar um aplicativo, uma classe, um módulo ou um procedimento armazenado para usar o novo nome por meio do sinônimo. O restante do código pode continuar usando o nome antigo. Você não eliminaria o sinônimo e renomearia até que todo o código fosse atualizado.
Aaron Bertrand

0

Bem, existem muitas armadilhas que você pode encontrar ao alterar o nome de tabelas e colunas. Qualquer outro código de aplicativo ou SQL que os chame terá que ser renomeado para corresponder ou não funcionará. O Redgate faz algumas ferramentas muito boas que podem passar e fazer todas as alterações nos dependentes veiws / functions / sprocs do SQL. O maior conselho que posso lhe dar é fazer essas alterações em um ambiente DEV primeiro e TEST TEST TEST para garantir que você tenha corrigido o código em todos os lugares.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.