AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 43065
Accepted
user11512
user11512
Asked: 2013-05-26 18:37:45 +0800 CST2013-05-26 18:37:45 +0800 CST 2013-05-26 18:37:45 +0800 CST

Como lidar com as restrições FK ao importar dados usando o Assistente de importação/exportação DTS?

  • 772

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.

sql-server sql-server-2012
  • 7 7 respostas
  • 63180 Views

7 respostas

  • Voted
  1. Best Answer
    user11512
    2013-05-27T07:17:23+08:002013-05-27T07:17:23+08:00

    Recebi esta solução em SQLTeam.com:

    Usar:

     EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
    

    Em seguida, importe seus dados

    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
    

    Usando esse método, consegui importar todos os dados sem problemas.

    • 39
  2. Zach Mierzejewski
    2015-09-23T21:49:28+08:002015-09-23T21:49:28+08:00

    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:

    1. 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 Tasksopção.

    2. Se algum dado foi inserido automaticamente no YourDB na criação, execute um arquivo DELETE FROM YourDB.dbo.tblYourTable.

      • Você não pode truncar dados quando existem chaves estrangeiras, então você precisa usar DELETE.
    3. Execute isso no seu servidor de destino:USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';

    4. Clique com o botão direito do mouse em YourDB em Object Explorer. Clique Tasks->Import Data...

    5. As primeiras telas do assistente são autoexplicativas.

    6. Na Select Source Table and Viewstela do assistente, clique na caixa de seleção ao lado de cada tabela que deseja copiar.

    7. Para cada linha (tabela) dessa tela, clique nela para que fique realçada e depois clique em Edit Mappings.

    8. Para cada linha (tabela), clique/marque Append rows to the destination tablee Enable identity insert.

      • Se você clicar Delete rows in destination table, ele falhará porque ele não emite um DELETEcomando, ele emite um TRUNCATEcomando que ainda está em conflito com nossas chaves estrangeiras porque TRUNCATEnão é governado pelo NOCHECK CONSTRAINTanterior.
    9. Clique no restante do assistente e clique em Finish.

    10. Fique atento aos erros ; avisos são provavelmente ok para ignorar.

      • Se houver erros, clique no Reportbotão e visualize o relatório. Tente descobrir o que era um Success, Errore Stopped. 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 um DELETE FROM YourDB.dbo.theErrorTable. Agora clique no botão voltar no assistente de importação e desmarque todas as tabelas que eram um arquivo Success. Repita ao infinito.
    11. Execute isso no seu servidor de destino:USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';

      • Se houver erros, ... não sei, mas corrija-os e tente novamente!
    12. Yay! :)

    Obrigado a todos que responderam a esta pergunta e perguntas semelhantes a esta na rede SE por me ajudarem a descobrir isso.

    • 8
  3. Kin Shah
    2013-05-27T07:44:43+08:002013-05-27T07:44:43+08:00

    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

    insira a descrição da imagem aqui

    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:

    insira a descrição da imagem aqui

    Nota: Você não pode TRUNCAR a tabela quando houver Chaves Estrangeiras definidas.

    • 4
  4. mrdenny
    2013-05-27T03:17:25+08:002013-05-27T03:17:25+08:00

    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.

    • 3
  5. krowe2
    2016-11-23T09:31:01+08:002016-11-23T09:31:01+08:00

    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 digitarEXEC 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.

    • 1
  6. user2404431
    2013-05-26T23:07:27+08:002013-05-26T23:07:27+08:00

    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.

    • 0
  7. Greg
    2015-02-09T19:53:02+08:002015-02-09T19:53:02+08:00

    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

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve