Estou tentando usar o SQL Server Import and Export Wizard para copiar dados do meu banco de dados de produção para meu banco de dados de desenvolvimento, mas quando faço isso falha com o erro "A instrução INSERT entrou em conflito com a restrição FOREIGN KEY" eu tenho mais de 40 tabelas com lotes de restrições FK, existe alguma maneira fácil de lidar com isso sem ter que escrever um script de restrição/adicionar restrição de descarte?
Edit: Acabei de descobrir que na edição Web do SQL Server, que é o que estou executando, o DTS não permitirá que você salve pacotes.
Recebi esta solução em SQLTeam.com:
Usando esse método, consegui importar todos os dados sem problemas.
Eu produzi uma cópia exata de um banco de dados em minha máquina de um servidor que eu não controlava.
Eu sou um idiota , mas isso é o que eu fiz:
Criei o banco de dados do meu script que estava no controle de origem (dica, dica!) Caso não tenha o script, você sempre pode gerá-lo a partir do banco de dados existente através da
Tasks
opção.Se algum dado foi inserido automaticamente no YourDB na criação, execute um arquivo
DELETE FROM YourDB.dbo.tblYourTable
.DELETE
.Execute isso no seu servidor de destino:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';
Clique com o botão direito do mouse em YourDB em
Object Explorer
. CliqueTasks
->Import Data...
As primeiras telas do assistente são autoexplicativas.
Na
Select Source Table and Views
tela do assistente, clique na caixa de seleção ao lado de cada tabela que deseja copiar.Para cada linha (tabela) dessa tela, clique nela para que fique realçada e depois clique em
Edit Mappings
.Para cada linha (tabela), clique/marque
Append rows to the destination table
eEnable identity insert
.Delete rows in destination table
, ele falhará porque ele não emite umDELETE
comando, ele emite umTRUNCATE
comando que ainda está em conflito com nossas chaves estrangeiras porqueTRUNCATE
não é governado peloNOCHECK CONSTRAINT
anterior.Clique no restante do assistente e clique em
Finish
.Fique atento aos erros ; avisos são provavelmente ok para ignorar.
Report
botão e visualize o relatório. Tente descobrir o que era umSuccess
,Error
eStopped
. Você provavelmente precisará corrigir qualquer que seja a causa raiz do erro que está enterrada nesse relatório em algum lugar. Então, você provavelmente precisará fazer umDELETE FROM YourDB.dbo.theErrorTable
. Agora clique no botão voltar no assistente de importação e desmarque todas as tabelas que eram um arquivoSuccess
. Repita ao infinito.Execute isso no seu servidor de destino:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';
Yay! :)
Obrigado a todos que responderam a esta pergunta e perguntas semelhantes a esta na rede SE por me ajudarem a descobrir isso.
No assistente de importação, você pode excluir as linhas primeiro e, se tiver campos de identidade, poderá ativar a inserção de identidade como abaixo
Se você deseja desabilitar a restrição de verificação, quando o assistente solicitar que você salve o pacote, salve-o e edite o gerenciador de conexões conforme abaixo:
Nota: Você não pode TRUNCAR a tabela quando houver Chaves Estrangeiras definidas.
Não abandone as restrições.
O que você deve fazer é salvar o pacote SSIS que o assistente cria e editá-lo em BIDS/SSDT. Ao editar o pacote, você poderá controlar a ordem em que as tabelas são processadas para poder processar as tabelas pai e depois processar as tabelas filhas quando todas as tabelas pai estiverem prontas.
Problemas como esse nos mostram que as pessoas que fazem o SQL Server nunca realmente usaram seu produto. Esta é uma omissão tão gritante que é preciso se perguntar o que mais eles simplesmente esqueceram de fazer corretamente (tenho uma lista de cerca de 30 outros problemas enlouquecedores como esse que tive que superar para fazer isso funcionar como outros bancos de dados fazem da caixa; incluindo o fato de que precisamos de um péssimo assistente para fazer isso em primeiro lugar [se eu tivesse o tempo que gastei esperando esse assistente se conectar e enumerar as mesmas tabelas para o mesmo banco de dados, todas as vezes, de volta ...eu teria tempo para umas boas férias]).
sou muito preguiçoso e não quero digitar
EXEC sp_msforeachtable ...
duas vezes cada vez que eu faço isso. Meu trabalho foi deixar as restrições no servidor de produção e removê-las do servidor dev. Isso evitará o erro, mas esse método tem alguns efeitos colaterais MUITO GRANDES. Primeiro, você não poderá mais restaurar um backup completo para seu servidor dev (a menos que você esteja certo em removê-los todos novamente). Segundo, isso funciona melhor quando você tem certeza de que os consumidores de seus dados também impõem essas restrições (ou não se importam com elas). No meu caso, temos apenas um consumidor (nosso site), portanto, também incluímos essas restrições no código do site (ou seja, antes de excluir um registro de usuário, excluímos primeiro todos os registros de telefone desse usuário). Sim, isso essencialmente nega a necessidade de restrições em primeiro lugar e duplica o trabalho que preciso fazer, mas também me dá a chance de verificar se meu código funciona com ou sem restrições baseadas em DBMS (o fato é que elas ainda estão no prod servidor apenas como plano de contingência). Você poderia chamar isso de uma falha no meu design, mas eu prefiro chamá-lo de uma solução alternativa para um DBMS defeituoso. De qualquer forma, ainda é mais rápido e fácil fazer isso em qualquer outro lugar do que a partir do MSSQL porque não consegue lidar com seu próprio design.Acho que você não pode realizar backup e restauração do servidor de produção, pois são dados cruciais. Bem, sem os devidos direitos, realmente se torna mais complicado. Mas se você tiver o db backup n restore correto, poderá executá-lo.
Ou então, uma maneira que eu recomendaria é descartar todas as suas restrições e índices e adicioná-los novamente assim que os dados forem importados ou exportados.
Não é uma resposta exata, mas será processada rapidamente.
Basta ler esse tópico. É um post antigo, mas aqui está o que eu fiz para ajudar as futuras pessoas que estão lendo isso.
No meu caso, eu queria importar para uma tabela idêntica vazia. Ao editar o mapeamento, seleciono
<ignore>
a chave primária. Todo o meu conteúdo está sendo adicionado automaticamente bem.Espero que ajude alguém