none
fazer uma trigger que delete tabelas pai e filho RRS feed

  • Pergunta

  • Ola a todos
    estou usando o sql server 2005.
    preciso excluir alguns dados da tabela clientes, mas ela esta recacionada com a tabela filha contas a receber.
    queria saber como faço para criar uma trigger nesta tabela de clientes de modo que consiga excluir os dados da tabela filha e depois excluir os dados na tabela pai.
    desde ja agradeco a atencao de todos.
    segunda-feira, 30 de novembro de 2009 19:27

Respostas

  • Boa Tarde,

    Eu seguiria as recomendações dos colegas e optaria pela exclusão em cascata. Além de ser declarativa, ela é mais eficiente e possui menos código envolvido. Se for via trigger, você terá que usar uma trigger Instead Of Delete, pois, como haverá "violação" não é possível usar uma trigger after tradicional. Ex:

    CREATE TRIGGER trg ON TblPai
    INSTEAD OF DELETE
    AS
    BEGIN
    -- Deleta os filhos correspondentes
    DELETE FROM TblFilho WHERE EXISTS (SELECT * FROM DELETED As D WHERE D.ID = tblFilho.ID)
    
    -- Deleta os pais
    DELETE FROM TblPai WHERE EXISTS (SELECT * FROM DELETED As D WHERE D.ID = TblPai.ID)
    END

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 30 de novembro de 2009 20:28
  • Ok.... a grosso modo é assim: Imagina duas tabelas Pai e Filha - Employees e Departments , onde o Departments tem uma FK para a chave de Employees:



    Create Trigger trgEmployees
    On Employees
    INSTEAD OF Delete
    as
    Begin
         
        -- Apagar todas as filhas
        Delete A
          From Departments A
               Inner Join [deleted] B On A.deptmgrid = B.Empid


       -- Apaga a tabela Pai
        Delete A
          From Employees A
               Inner Join [deleted] B On A.Empid = B.Empid

    End


    Tks. Fausto Fiorese Branco MCTS - SQL Server 2k5 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    segunda-feira, 30 de novembro de 2009 20:21

Todas as Respostas

  • Edspicer, isso realmenete não é uma pratica comum e IMHO nem um pouco segura... mas se você realmente precisa, acho que melhor que uma trigger pode ser você altera as Foreign Keys para "On Delete Cascade":

    http://msdn.microsoft.com/en-us/library/ms186973(SQL.90).aspx
    Tks. Fausto Fiorese Branco MCTS - SQL Server 2k5 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    segunda-feira, 30 de novembro de 2009 19:43
  • Sem sombra de dúvida, o melhor caminho a seguir é você definir a opção On Delete Cascade na sua Foreign Key, contudo, se você realmente for fazer utilizando Trigger, entao você precisa primeiro excluir os registros filhos antes de excluir o registro pai.



    Espero ter ajudado
    Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa
    segunda-feira, 30 de novembro de 2009 19:48
  • entao, teria que usar a trigger mesmo....
    mas como eu faria esta construção dentro da trigger?

    segunda-feira, 30 de novembro de 2009 19:55
  • Ok.... a grosso modo é assim: Imagina duas tabelas Pai e Filha - Employees e Departments , onde o Departments tem uma FK para a chave de Employees:



    Create Trigger trgEmployees
    On Employees
    INSTEAD OF Delete
    as
    Begin
         
        -- Apagar todas as filhas
        Delete A
          From Departments A
               Inner Join [deleted] B On A.deptmgrid = B.Empid


       -- Apaga a tabela Pai
        Delete A
          From Employees A
               Inner Join [deleted] B On A.Empid = B.Empid

    End


    Tks. Fausto Fiorese Branco MCTS - SQL Server 2k5 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    segunda-feira, 30 de novembro de 2009 20:21
  • Boa Tarde,

    Eu seguiria as recomendações dos colegas e optaria pela exclusão em cascata. Além de ser declarativa, ela é mais eficiente e possui menos código envolvido. Se for via trigger, você terá que usar uma trigger Instead Of Delete, pois, como haverá "violação" não é possível usar uma trigger after tradicional. Ex:

    CREATE TRIGGER trg ON TblPai
    INSTEAD OF DELETE
    AS
    BEGIN
    -- Deleta os filhos correspondentes
    DELETE FROM TblFilho WHERE EXISTS (SELECT * FROM DELETED As D WHERE D.ID = tblFilho.ID)
    
    -- Deleta os pais
    DELETE FROM TblPai WHERE EXISTS (SELECT * FROM DELETED As D WHERE D.ID = TblPai.ID)
    END

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 30 de novembro de 2009 20:28
  • OK, vou tenta fazer esta trigger.

    grato pela ajuda.
    segunda-feira, 30 de novembro de 2009 21:25
  • Bom dia Gustavo.

    eu fiz esta trigger e ela funcionou perfeitamente.

    Obrigado pela ajuda.
    • Marcado como Resposta Edspicer terça-feira, 1 de dezembro de 2009 11:30
    • Não Marcado como Resposta Gustavo Maia Aguiar terça-feira, 1 de dezembro de 2009 13:33
    terça-feira, 1 de dezembro de 2009 11:30