Eu tenho uma tabela em um banco de dados Microsoft SQL 2012, chamado Cursos. Ele foi "convertido" de um banco de dados originalmente SQL 2000, convertido para o banco de dados SQL 2008 e depois convertido novamente para 2012 (você não pode converter diretamente de 2000 para 2012).
Um resultado disso é que temos algumas tabelas que possuem o tipo de dados text/ntext antigo, e eu quero alterar o tipo de dados para varchar(max) ou nvarchar(max). Por motivos que não entendo muito bem, não posso simplesmente alterar o tipo de dados das colunas ntext para nvarchar(max), pois sempre que tento fazer isso na visualização Table Design, recebo este erro:
Além disso, se eu tentar simplesmente clicar com o botão direito do mouse na tabela Cursos no Management studio e excluí-la, vejo que existem alguns outros objetos de banco de dados dependentes de Cursos e, ao tentar excluir, recebo uma mensagem de erro dizendo que não posso fazer então, porque Courses é referenciado por outra restrição de chave estrangeira de outro objeto.
Então, essencialmente o que eu quero fazer é recriar uma tabela, que tem outros objetos dependendo dela, e a única coisa diferente sobre a recriação é que eu quero mudar as colunas text/ntext nela para varchar(max) e nvarchar( max) tipos de dados. Tudo atualmente "dependendo" da 'antiga' tabela de Cursos, precisa então "depender" da 'nova' tabela de Cursos recriada. Qual é a maneira mais fácil de fazer isso no SQL 2012?
A maneira mais simples de contornar isso é alterar algumas opções no Management Studio.
Vá para Ferramentas, Opções, Designers, Designers de tabela e banco de dados. Desmarque "Impedir salvar alterações que exigem recriação de tabela".
De um modo geral, o Management Studio lidará adequadamente com as dependências quando você modificar uma tabela de uma maneira que exija que ela seja recriada (ele fará vários truques com tabelas temporárias nos bastidores, que você pode ver se você disser a ele para gerar um script de alteração de realmente fazer as alterações). No entanto, isso pode envolver modificações/alterações em tabelas relacionadas ou chaves estrangeiras. Em outras palavras, não faça isso em um sistema ativo se puder ajudar, e certifique-se de ter backups antes de fazer isso.
Você pode modificar as
ntext
colunas paranvarchar(max)
usar T-SQL. Eu só recomendaria fazer isso se a tabela/banco de dados não estiver sendo usada ativamente. Se a tabela for muito pequena, esse método será bastante rápido e normalmente sem problemas. No entanto, se você tiver centenas de milhões de linhas ou mais, eu ficaria preocupado em fazer isso sem testá-lo primeiro em um ambiente de não produção para que você tenha uma ideia de como funciona e quais requisitos de espaço serão em sua situação .Para mostrar como isso funciona e para provar que pode ser feito, configurei este banco de testes.
Primeiro, criamos uma tabela com uma
ntext
coluna e a preenchemos com 1.000 linhas de dados aleatórios:Aqui, convertemos o
MyNTextColumn
paranvarchar(max)
:Isso descarta a tabela temporária criada acima, para limpar:
Caminho alternativo:
Você poderia...
transfer_temp nvarchar(max)
à sua tabela existente<old_column_name>
para<old_column_name>_back
transfer_temp
para<old_column_name>
<old_column_name>_back
A vantagem é que seus dados ainda estão na definição de coluna antiga até você descartar a coluna após testar o aplicativo e/ou os dados.
Isso pode ser alcançado da seguinte forma:
Em seguida, mova os dados da coluna antiga para a nova coluna:
Renomeie suas colunas:
Teste seu aplicativo novamente.
Elimine os dados antigos:
Finalizado.
sp_rename