none
Replicação Transacional - FK com DELETE CASCADE RRS feed

  • Pergunta

  • Boa tarde pessoal.

    Acabei de me deparar com um problema de FK com DELETE CASCADE.

    Tenho a tabela A com PK e a tabela B com um campo como FK da tabela A, com delete cascade. Se eu deletar o registro na tabela A, irá deletar automaticamente o registro da tabela B. Essa minha FK é NOT FOR REPLICATION.

    Num determinando momento o meu registro da tabela A sofreu alterações simultâneas em dois subscribers. Na hora que chegou no publisher, conflito... até ai, OK.

    O problema é que internamente na replicação, quando o sql identifica esse conflito do registro ele executa um delete dessa informação e um insert novamente na versão que vai ganhar o conflito.

    delete [dbo].[A] where  [IdA] = @c1_old 

    O problema é que esse delete acaba acionando o cascade, e deleta o registro da tabela B. Ou seja... duas alterações no registro e o sql acabou deletando o meu registro filho.... 

    Gostaria de saber se isso é normal, ou seja, a replicação decidir por executar o que teoricamente é da minha modelagem. Devo evitar a opção CASCADE? Existe CASCADE NOT FOR REPLICATION?

    Vlw pessoal.


    André Duarte

    quarta-feira, 16 de julho de 2014 18:27

Respostas

  • André,

    Então se o SQL Server esta realizando este comportamento, é porque as operações que estão sendo processadas estão fazendo ele agir assim, dizer que é o comportamento padrão pode ser incoerente e vago.

    Acredito que neste caso é melhor você remover o Cascade e observar se não existem outros impactos!!!

    Agora uma outra alternativa é replicar esta Foreign Key e observar o comportamento da replicação para entender o que pode acontecer.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Sugerido como Resposta Edinaldo Junior sexta-feira, 25 de julho de 2014 19:01
    • Marcado como Resposta André Duarte quinta-feira, 11 de dezembro de 2014 13:18
    sexta-feira, 25 de julho de 2014 17:28
    Moderador
  • Fiz mais testes, um pouco mais detalhados e não encontrei mais problemas.

    O meu cascade que não estava replicado em um dos lados. Depois acertei tudo e funcionou 100%.


    André Duarte

    • Marcado como Resposta André Duarte quinta-feira, 11 de dezembro de 2014 13:18
    quinta-feira, 11 de dezembro de 2014 13:18

Todas as Respostas

  • André,

    Então se o SQL Server esta realizando este comportamento, é porque as operações que estão sendo processadas estão fazendo ele agir assim, dizer que é o comportamento padrão pode ser incoerente e vago.

    Acredito que neste caso é melhor você remover o Cascade e observar se não existem outros impactos!!!

    Agora uma outra alternativa é replicar esta Foreign Key e observar o comportamento da replicação para entender o que pode acontecer.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Sugerido como Resposta Edinaldo Junior sexta-feira, 25 de julho de 2014 19:01
    • Marcado como Resposta André Duarte quinta-feira, 11 de dezembro de 2014 13:18
    sexta-feira, 25 de julho de 2014 17:28
    Moderador
  • Fiz mais testes, um pouco mais detalhados e não encontrei mais problemas.

    O meu cascade que não estava replicado em um dos lados. Depois acertei tudo e funcionou 100%.


    André Duarte

    • Marcado como Resposta André Duarte quinta-feira, 11 de dezembro de 2014 13:18
    quinta-feira, 11 de dezembro de 2014 13:18