copiei oldDatabase
como newDatabase
. newDatabase
Esquema de modificado .
Enquanto isso, oldDatabase
os dados de estão sendo processados e atualizados.
Eu quero copiar oldDatabase
os dados para newDatabase
.
O que tenho feito é:
- Limpe os dados de
newDatabase
- Gerar script apenas de dados de
oldDatabase
- Execute este script em
newDatabase
.
E recebi muitas mensagens de erro como:
Cannot insert explicit value for identity column in table 'MyTableName' when
IDENTITY_INSERT is set to OFF.
Invalid column name 'MyColumnName'.
Violation of PRIMARY KEY constraint 'PK_MyTableName'. Cannot insert duplicate
key in object 'dbo.MyTableName'.
Alguns dados de tabelas e linhas são afetados. Mas as tabelas com o erro acima não são afetadas. Como posso consertar isso? Existe uma melhor maneira de fazer essas coisas?
PS
Eu corro meu script usando este comando,
sqlcmd -S myServerName -U userName -P passowrd -i PathOfMyScriptFile
O que seu script está fazendo é tentar explicitamente inserir dados em uma coluna IDENTITY. Você precisa fazer uma das duas coisas: definir IDENTITY_INSERT como ON para essa tabela antes da inserção ou retrabalhar a instrução INSERT para que ela não tenha a coluna IDENTITY especificada com um valor.
Pelo que parece, você tem três tipos diferentes de problemas.
Você tem colunas de identidade. Para uma tabela que possui uma coluna de identidade, você tem três opções. Primeiro, quando você fizer sua inserção, exclua a coluna de identidade. Em segundo lugar, remova a propriedade de identidade da coluna na tabela de destino. Em terceiro lugar, use identity_insert. Para usar identity_insert, primeiro você deve ativá-lo para a tabela.
Então você faz a sua inserção. Nota: você deve listar todas as colunas na inserção.
Não
E por último, mas não menos importante, certifique-se de desativar a inserção_identidade novamente. Identity_insert só pode ser ativado para uma tabela por vez para uma determinada conexão.
Aqui está um bom passo a passo para inserir em colunas de identidade.
Você disse que mudou a estrutura de 'newDatabase'. Bem, meu palpite é que você removeu 'MyColumnName'. Exclua isso da inserção ou adicione a coluna de volta. Você precisa garantir que a estrutura
newDatabase
correspondaoldDatabase
ou levar em conta as diferenças em suas inserções.Por último, mas não menos importante, você está inserindo dados
newDatabase
onde os dados já existem. Ou pelo menos os valores da chave primária já existem emnewDatabase.MyTableName
. Minha sugestão aqui é se houver alguma chance de você estar fazendo atualizações, bem como inserções, altere suasINSERT
declarações paraMERGE
declarações. Caso contrário, adicione umWHERE NOT EXISTS
ou algo semelhante àSELECT
instrução em suaINSERT
instrução para excluir todas as linhas em que a chave primária já existe emnewDatabase.MyTableName
.