Um aplicativo está usando um banco de dados SQL Server 2008 que possui colunas de ID, mas essas colunas não são chaves primárias e não possuem nenhum IDENTITY
atributo.
O que preciso fazer agora é adicionar os PKs e IDENTITY
atributos. No entanto, os IDs antigos devem ser preservados.
Além disso, preciso fazer isso com comandos SQL (sem GUI).
problemas
Eu tentei todas as soluções a seguir, sem sucesso.
- Eu não posso diretamente
INSERT
/UPDATE
umIDENTITY
valor - Não consigo desativar
IDENTITY
a restrição para mais de uma tabela simultaneamente - Não consigo copiar dados com
ALTER TABLE ... SWITCH TO
(não funciona se a tabela de origem não tiver PK e a tabela de destino tiver PK) Não posso usar sequências em vez de
IDENTITY
s para chaves primárias, porque 2008 não suporta sequênciasO seguinte também não funciona:
SET IDENTITY_INSERT mydb.dbo.AZIENDE_NEW ON; INSERT INTO mydb.dbo.AZIENDE_NEW SELECT * FROM mydb.dbo.AZIENDE_OLD;
eu recebo erro
Msg 8101: Um valor explícito para a coluna de identidade na tabela 'mydb.dbo.AZIENDE_NEW' só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está ON
Isso me parece ilógico. IDENTITY_INSERT
deve ser ON
para essa mesa...
Estou aberto a outras soluções, mas não tenho mais ideias.
A maneira mais fácil de fazer isso é usar a GUI do SSMS, clicar com o botão direito do mouse no designer e usar "Gerar scripts". Isso gera uma reconstrução de tabela que preserva os dados e faz alterações no esquema para você.
Se você se preocupa com o desempenho, precisa usar a
SWITCH
técnica. Torne o esquema das duas tabelas compatível com switch, alterne e altere o esquema de volta. Dessa forma, você pode adicionar aIDENTITY
propriedade sem (ou com redução) a movimentação de dados.Sim, isso não funciona. Crie uma tabela compatível para uso com switch. Você pode alternar pilhas muito bem, mas ambos os lados precisam ser pilhas.
Você mesmo pode escrever o script de reconstrução.