Pergunta

Agora que já ficou sem capacidade int sobre uma coluna PK (que é um IDENTITY) Eu gostaria de fazer isso com bigint, mas simples ALTER TABLE parece ser incapaz de lidar com tão grande de uma tabela. Então, minha pergunta é: como faço para alterar o tipo de uma coluna de PK com a manutenção de valores reais no lugar e eu preciso para alterar referenciando mesas bem

Foi útil?

Solução

Além de sugestão da KLE, as consultas a seguir podem ajudar:

Para desativar todas as restrições sobre as mesas que a referência tentativa OldTable para executar a saída da seguinte consulta:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Para mover todos os dados para a nova tabela, com alteração do campo tente o seguinte:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

Para largar a tabela antiga:

DROP TABLE oldTable

Para mudar o nome da nova tabela para o nome antigo:

sp_rename newTable, oldTable

Para reactivar todas as restrições sobre as tabelas que fazem referência OldTable, tente executar a saída da seguinte consulta:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Hope isso ajuda ...

Outras dicas

O que gostaria de fazer é:

salvar sua mesa

  1. criar uma nova tabela com a estrutura correta
  2. desativar todas as restrições sobre estas tabelas, e os que referenciá-los
  3. mover todos os dados para a nova tabela, com alteração do campo; isso pode ser feito por lotes
  4. excluir a tabela antiga, quando ele está vazio
  5. mudar o nome da nova tabela para o nome antigo
  6. permitir que todas as restrições em todas as mesas (algumas coluna FK e restrições provavelmente precisam de fixação também ... Mas eles não são PK, por isso eles são modificáveis)

    6 editado (graças aos Alexey)

Este é limpo, factível em lotes, bem entendido.

Você precisará também alterar as tabelas filho. Afinal, você será agora tentar inserir um grande int para eles também. Eu mudaria sobre as tabelas filho primeira

Este não é um processo fácil ou curto. Gostaria de sugerir a você que você diga aos seus usuários o banco de dados vai ser desligado para manutenção (você pode medir quanto tempo por quanto tempo leva para fazer dev) em uma data set e redefinir o databse para o modo de usuário único, enquanto você faz estas mudanças. Você não quer perder dados que são adicionados (ou alterados) pelos usuários para uma mesa enquanto você está mudando para o outro. Se por somereason você não pode janela havea maintence (e eu sugiro fortemente em prol da integridade dos dados que você faz), então você deve alterar as tabelas filho mais primeiro, para evitar inserir erros se o seu realmente perto do limite e será vendo os grandes números quase imediatamente.

Certifique-se de roteiro toda a estrutura datbase incluindo padrões, gatilhos, verificação constrants índices etc como você vai querer recriar tudo.

Certifique-se de fazer tudo isso através de scripts em desenv. Isso fará com que seja muito mais fácil fazer um prod depois de ter testado o out processo.

Eu sou acho que você só pode criar um novo banco de dados com tipo de dados alterado PK, e, em seguida, exportar / importar dados, ou inserção em massa para um novo, em seguida, renomeie novo banco de dados. É claro que este real se você tiver muitas tabelas referenciadas e seu novo PK tipo de dados não é compatível com anterior.

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