none
Problema com Cascade Delete. RRS feed

  • Pergunta

  • Pessoal tenho a seguinte situação, uma tabela de Pedidos e uma de Itens:

    Pedidos
    (
    cod_pedido int,
    cod_cliente int,
    tipo int
    )

    Itens
    (
    cod_pedido int,
    cod_produto int,
    quantidade int
    )

    Na tabela de itens tem uma trigger que faz a devida movimentação do estoque, de acordo com o tipo de pedido, seguindo a seguinte regra:
    Tipo = 1 : Diminue o estoque
    Tipo = 2 : Aumenta o estoque

    A referencia de itens para pedidos tem cascade delete, eu acho que de acordo com o cascade delete o sql server deveria apagar primeiro os itens e depois o pedido, e o que esta acontecendo é que quando a trigger é executada o pedido já não existe mais e eu não consigo saber qual o tipo do pedido.


    Alguem pode me dizer o por que isso ta acontecendo, e se tem uma possivel solução?

    Obrigado a todos.

    At;
    Ricardo Lima
    terça-feira, 15 de julho de 2008 20:50

Todas as Respostas

  • Ricardo,

    Poderia postar o código completo? Preciso saber exatamente como foi criada a referência.
    quinta-feira, 17 de julho de 2008 00:38
  • Caro Rodgrigo segue como as referencias são criadas;

    alter table itens
       add constraint FK_ITENS_REF_PEDIDIOS foreign key (COD_PEDIDO)
          references PEDIDOS (COD_PEDIDO)
             on delete cascade
    go
    quinta-feira, 17 de julho de 2008 11:37
  • Bom dia,

     

    Acredito que o problema seja na trigger, passe o codigo das triggers.

     

    Abraços,

     

    quinta-feira, 17 de julho de 2008 11:53
  • Alexandre,

     

    Concordo com você, seria interessante verificar o código da Trigger!!!

    quinta-feira, 17 de julho de 2008 12:31
    Moderador
  • Ricardo,

     

    Só para esclarecer o cascade no seu caso só exclui o pedido da tabela Itens caso o mesmo seja excluido da tabela Pedidos. Com certeza é a trigger onde esta o problema.

     

    Abraços,

    quinta-feira, 17 de julho de 2008 12:43
  • Segue ai pessoal

    Create Trigger TG_ITENS_CONTROLA_ESTOQUE
       On ITENS
        For  DELETE
    As
    Begin

        Set NoCount On;
        Set Xact_Abort On;   
        Begin Transaction;
        Declare @CodProduto int;
        Declare @Quantidadde int;
        Declare @Tipo Int;

        Declare Produtos Cursor Local For
            Select COD_PRODUTO,QUANTIDADE,TIPO
            From DELETED I
            Inner Join PEDIDOS P On I.COD_PEDIDO = P.COD_PEDIDO
        Open Produtos;

        //Nesse ponto o curor não traz dados pois o pedido na tabela de pedidos já não existe mais
        //Eu cheguei a colocar código abaixo para confirmar
        // Declare @i int;
        // Declare @pedido int;
        //Select @pedido = cod_pedido from DELETED
        //select @i = count(*) from pedidos where cod_pedido = @pedido
        //print @i
        // @i sempre está 0(zero)

        //Código da movimentação de estoque
       
        Commit Transaction;
    End
    quinta-feira, 17 de julho de 2008 12:51
  • Bom vamos lá,

     

    Você esta se confundindo um pouco na historia do Cascade, o que ele vai fazer é apagar todos os filhos quando for apagado o pai. No seu caso acho melhor você mexer na aplicação mesmo e não utilizar o cascade.

     

    Abraços,

     

    quinta-feira, 17 de julho de 2008 13:11
  • Alexandre,

     

    Mas uma vez devo concordar com você.

     

    Particularmente falando eu não gosto de utilizar este tipo de funcionalidade, Update Cascade ou Delete Cascade, por questões de regras de négocio, como também pelo custo de processamento que isso possa gerar, que é algo parecido com o Trigger.

     

    Também você como uma solução interessante fazer todo este tipo de tratamento na aplicação, mas é claro que algumas regras de negócios, ficam melhores a nível de gerenciamento e administração quando implentadas dentro de banco de dados.

    quinta-feira, 17 de julho de 2008 13:44
    Moderador
  • Alexandre obrigado pelas respostas,

    Acho que não é confusão minha, o cascade delete realmente faz o que eu quero, quando apagar o pai ele apaga os filhos, pelo lógica acho que ele deveria primeiro apagar os filhos e depois apagar o pai, o que está acontecendo que quando vai apagar os filhos o pai já não existe mais.
    quinta-feira, 17 de julho de 2008 13:51
  • Ricardo,

     

    Isso já representa uma falha de integridade relacional!!!

     

    Pode esta ocorrendo por alguma falha no relacionamento entre a tabela pai com a tabela filho.

    quinta-feira, 17 de julho de 2008 13:55
    Moderador
  • Junior as regras pra esse caso ficam melhores se implementadas no banco.
    quinta-feira, 17 de julho de 2008 13:55