none
Deleção RRS feed

  • Pergunta

  • Bom dia!

    Estou migrando uma base firebird para SQL, estou com problemas nos relacionamentos , os relacionamentos que estão no firebird não funcionam no sql server, o sql diz que existe múltiplos caminhos enfim, como estou trazendo dados na migração do banco não posso alterar nada. Exemplo

    Firebird

    Estrutura

    Corretora

    PontoVenda

    Elas se relacionam e existe um cascade com pontovenda com a etrutura e a corretora com a estrutura. isso o SQL nao aceita.

    Agora os desenvolvedores nos testes nao conseguem deletar pq estoura FK_controle_estrutura_pontoVenda.

    Quando ele mandam um delete na estrutura.

    Qual a melhor saida??

    quinta-feira, 6 de dezembro de 2018 11:44

Respostas

  • Segue um esboço da trigger:

    ALTER TRIGGER [dbo].[controleestrutura_Trg_Instead_Of_Delete]
       ON  [dbo].[controleestrutura] 
       INSTEAD OF DELETE
    AS 
    BEGIN
        DELETE p
        from pontovenda as 
        inner join deleted as d
            on p.codigopontovenda = d.codigoestrutura;
            
        DELETE e
        from controleestrutura as e
        inner join deleted as d
            on e.codigoestrutura = d.codigoestrutura;
    END

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 14:13

Todas as Respostas

  • Bom dia,

    Fernando, você pode postar a estrutura das tabelas envolvidas (pelo menos as partes relevantes para a questão) e as mensagens de erro exibidas, bem como o momento em que ocorrem os erros?


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 6 de dezembro de 2018 13:34
  • Olá Fernando, tente os seguintes comandos:

    ALTER TABLE dbo.TabelaQueTemARestricao   
    DROP CONSTRAINT FK_controle_estrutura_pontoVenda;  
    GO  
    
    
    ALTER TABLE dbo.TabelaQueTemARestricao
       ADD CONSTRAINT FK_controle_estrutura_pontoVenda
       FOREIGN KEY (TabelaQueTemARestricao.ChavePrimaria) REFERENCES dbo.outraTabela(EmployeeID) ON DELETE CASCADE

    Troque os nomes das tabelas para o nome das tabelas que você tem.

    quinta-feira, 6 de dezembro de 2018 14:15
  • da uma olhadinha

    

    quinta-feira, 6 de dezembro de 2018 16:28
  • Fernando, você pode postar o script de criação das FKs? 

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 00:32
  • Opa...

    Segue

    alter table pontovenda add constraint fk_pontovenda_controleestrutur foreign key (codigopontovenda) references controleestrutura (codigoestrutura) on delete  no action on update no action; 

    sexta-feira, 7 de dezembro de 2018 11:00
  • Pelo que vi o cascade não está ativo.

    Em que momento está ocorrendo o erro? Ao excluir uma estrutura? Ao ativar o cascade? Qual mensagem de erro é exibida?


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 12:18
  • Quando ativo o cascade e vou salvar ele diz que não pode devido a múltiplas referencias 

    Tabela 'controleestrutura' salva com êxito
    Tabela 'pontovenda'
    - Não é possível criar a relação 'fk_pontovenda_controleestrutur'.  
    Introducing FOREIGN KEY constraint 'fk_pontovenda_controleestrutur' on table 'pontovenda' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
    Could not create constraint or index. See previous errors.

    sexta-feira, 7 de dezembro de 2018 12:24
  • Existe alguma outra FK no banco de dados referenciando a tabela controleestrutura e com cascade?



    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 12:45
  • Sim, existe, e como eh uma conversão isso acontece para todos os lados, ai estou pensando em fazer os Delete ou por Trigger ou por procedure. o que você acha mais viavel? 

    sexta-feira, 7 de dezembro de 2018 12:53
  • Nesse caso optaria pela trigger.

     

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 13:25
  • Poderia me ajudar na construção desta trigger??

    Um delete em trigger

    Att

    sexta-feira, 7 de dezembro de 2018 13:33
  • Segue um esboço da trigger:

    ALTER TRIGGER [dbo].[controleestrutura_Trg_Instead_Of_Delete]
       ON  [dbo].[controleestrutura] 
       INSTEAD OF DELETE
    AS 
    BEGIN
        DELETE p
        from pontovenda as 
        inner join deleted as d
            on p.codigopontovenda = d.codigoestrutura;
            
        DELETE e
        from controleestrutura as e
        inner join deleted as d
            on e.codigoestrutura = d.codigoestrutura;
    END

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 7 de dezembro de 2018 14:13
  • ajuda muito, agora vou correr atras para fazer a tratativa de erro e as validações antes de deletar, ja te perguntei demais... heheheh
    sexta-feira, 7 de dezembro de 2018 15:53