Carregando ...
Desculpe, ocorreu um erro ao carregar o conteúdo.
 

Sp para excluir registro

Expandir mensagens
  • Dalmiro
    Boa tarde pessoal, Tenho que criar uma sp, para exclusπo de registros, mas a tabela principal tem relaτπo com outras 2 tabelas e estas relaτ⌡es nπo
    Mensagem 1 de 13 , 22 de jan 07h18min

      Boa tarde pessoal,

      Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

      Dúvidas

      1 – Posso recriar a contraint com esta referencia? Como?

      2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

      3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

      4 – Alguma dica?

       

      Obrigado

      att

       

      Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
      www.avast.com
    • Andre Luiz Reis Marques
      Boa tarde Dalmiro, Analisa o impacto de recriar os indices.  - Quantas tabelas estao envolvidas?- Voce pode quebrar as constrais (drop), rodar um truncate nas
      Mensagem 2 de 13 , 22 de jan 08h16min
        Boa tarde Dalmiro,

        Analisa o impacto de recriar os indices.  
        - Quantas tabelas estao envolvidas?
        - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!
        - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

        Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.
        Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.
         
        Atenciosamente,
        André Luiz R. Marques
        Administrador de Banco de Dados - SQL Server/Oracle
        Tel: (21) 99978-4564
         
        Evite imprimir. Colabore com o Meio Ambiente!
         
        "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
        começar agora e fazer um novo fim."
                       Chico Xavier



        Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:


         
        Boa tarde pessoal,
        Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.
        Dúvidas
        1 – Posso recriar a contraint com esta referencia? Como?
        2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?
        3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?
        4 – Alguma dica?
         
        Obrigado
        att
         
        Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
        www.avast.com


      • João Polisel
        Boa noite Dalmiro, Alterar a constraint para delete cascade pode ser feito removendo-a e adicionando de volta com esta opτπo, mas eu nπo recomendaria pois
        Mensagem 3 de 13 , 24 de jan 18h11min

          Boa noite Dalmiro,

           

          Alterar a constraint para delete cascade pode ser feito removendo-a e adicionando de volta com esta opção, mas eu não recomendaria pois pode trazer impacto a outras partes do código. Você terai que testar isso muito bem!

           

          Você pode criar sua SP para trabalhar com uma transação onde você apaga cada uma das tabelas filhas (DELETE tbFilha FROM tbPai WHERE <join entre pai e filha> AND <critéria de busca do registro na tabela pai>) e em seguida apaga a tabela pai.

           

          Use TRY CATCH para controlar erros que podem acontecer durante a execução e executar COMMIT ou ROLLBACK

           

          []s

           

          João Polisel

           

          From: mssql-l@... [mailto:mssql-l@...]
          Sent: Friday, January 22, 2016 1:19 PM
          To: mssql-l@...
          Subject: [mssql-l] Sp para excluir registro

           

           

          Boa tarde pessoal,

          Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

          Dúvidas

          1 – Posso recriar a contraint com esta referencia? Como?

          2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

          3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

          4 – Alguma dica?

           

          Obrigado

          att

           

          Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
          www.avast.com

        • Dalmiro
          Ok...obrigado Joπo Polisel De: mssql-l@yahoogrupos.com.br [mailto:mssql-l@yahoogrupos.com.br] Enviada em: segunda-feira, 25 de janeiro de 2016 00:12 Para:
          Mensagem 4 de 13 , 25 de jan 07h58min

            Ok...obrigado João Polisel

             

             

            De: mssql-l@... [mailto:mssql-l@...]
            Enviada em: segunda-feira, 25 de janeiro de 2016 00:12
            Para: mssql-l@...
            Assunto: RE: [mssql-l] Sp para excluir registro

             

             

            Boa noite Dalmiro,

             

            Alterar a constraint para delete cascade pode ser feito removendo-a e adicionando de volta com esta opção, mas eu não recomendaria pois pode trazer impacto a outras partes do código. Você terai que testar isso muito bem!

             

            Você pode criar sua SP para trabalhar com uma transação onde você apaga cada uma das tabelas filhas (DELETE tbFilha FROM tbPai WHERE <join entre pai e filha> AND <critéria de busca do registro na tabela pai>) e em seguida apaga a tabela pai.

             

            Use TRY CATCH para controlar erros que podem acontecer durante a execução e executar COMMIT ou ROLLBACK

             

            []s

             

            João Polisel

             

            From: mssql-l@... [mailto:mssql-l@...]
            Sent: Friday, January 22, 2016 1:19 PM
            To: mssql-l@...
            Subject: [mssql-l] Sp para excluir registro

             

             

            Boa tarde pessoal,

            Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

            Dúvidas

            1 – Posso recriar a contraint com esta referencia? Como?

            2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

            3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

            4 – Alguma dica?

             

            Obrigado

            att

             

            Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
            www.avast.com

            Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
            www.avast.com
          • Dalmiro
            Obrigado pelo retorno São só 3 tabelas envolvidas. Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento
            Mensagem 5 de 13 , 28 de jan 02h54min

              Obrigado pelo retorno

              São só 3 tabelas envolvidas.

              Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

              Tenho 2 possibilidades...vou fazer uns testes...

              1 – tratar cada tabela

              2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

               

              Irei testar

              Obrigado

              att

               

               

              De: mssql-l@... [mailto:mssql-l@...]
              Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
              Para: mssql-l@...
              Assunto: Re: [mssql-l] Sp para excluir registro

               

               

              Boa tarde Dalmiro,

               

              Analisa o impacto de recriar os indices.  

              - Quantas tabelas estao envolvidas?

              - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

              - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

               

              Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

              Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

               

              Atenciosamente,
              André Luiz R. Marques
              Administrador de Banco de Dados - SQL Server/Oracle

              Tel: (21) 99978-4564

               

              Evite imprimir. Colabore com o Meio Ambiente!

               

              "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
              começar agora e fazer um novo fim."

                             Chico Xavier

               

              Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

               

               

              Boa tarde pessoal,

              Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

              Dúvidas

              1 – Posso recriar a contraint com esta referencia? Como?

              2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

              3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

              4 – Alguma dica?

               

              Obrigado

              att

               

              Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
              www.avast.com

               

              Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
              www.avast.com
            • João Polisel
              Boa tarde Dalmiro, Mais um motivo para você deixar a constraint quieta... Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que
              Mensagem 6 de 13 , 28 de jan 14h22min

                Boa tarde Dalmiro,

                 

                Mais um motivo para você deixar a constraint quieta...

                 

                Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                 

                Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                 

                Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                 

                Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                 

                Por este motivo, lhe recomendo ficar com a opção 1

                 

                []s

                 

                João Polisel

                 

                From: mssql-l@... [mailto:mssql-l@...]
                Sent: Thursday, January 28, 2016 8:55 AM
                To: mssql-l@...
                Subject: RES: [mssql-l] Sp para excluir registro

                 

                 

                Obrigado pelo retorno

                São só 3 tabelas envolvidas.

                Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                Tenho 2 possibilidades...vou fazer uns testes...

                1 – tratar cada tabela

                2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                 

                Irei testar

                Obrigado

                att

                 

                 

                De: mssql-l@... [mailto:mssql-l@...]
                Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                Para: mssql-l@...
                Assunto: Re: [mssql-l] Sp para excluir registro

                 

                 

                Boa tarde Dalmiro,

                 

                Analisa o impacto de recriar os indices.  

                - Quantas tabelas estao envolvidas?

                - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

                 

                Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

                Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

                 

                Atenciosamente,
                André Luiz R. Marques
                Administrador de Banco de Dados - SQL Server/Oracle

                Tel: (21) 99978-4564

                 

                Evite imprimir. Colabore com o Meio Ambiente!

                 

                "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                começar agora e fazer um novo fim."

                               Chico Xavier

                 

                Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                 

                 

                Boa tarde pessoal,

                Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

                Dúvidas

                1 – Posso recriar a contraint com esta referencia? Como?

                2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

                3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

                4 – Alguma dica?

                 

                Obrigado

                att

                 

                Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                www.avast.com

                 

                Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                www.avast.com

              • Daniel Cavalcante Scalisse
                Olá. Segue script de SP que uso nas minhas aplicações e que melhoraram muito a performance. Como esse modelo é executado diariamente pela aplicação, não
                Mensagem 7 de 13 , 28 de jan 20h29min

                  Olá.

                  Segue script de SP que uso nas minhas aplicações e que melhoraram muito a performance.

                  Como esse modelo é executado diariamente pela aplicação, não altero nada de Constraint e Índice, mesmo porque o usuário da aplicação tem somente acesso de leitura e escrita.

                  Espero ter contribuído.

                  Aceito críticas e sugestões.

                   

                  #########################################################################

                  USE [SeuDB]

                  GO

                   

                  PRINT 'SP_Cargo_Excluir'

                  if exists (select 1 from dbo.sysobjects where id=object_id(N'SP_Cargo_Excluir') and OBJECTPROPERTY(id,N'IsProcedure')=1)

                  DROP PROCEDURE SP_Cargo_Excluir

                  GO

                   

                  CREATE PROCEDURE SP_Cargo_Excluir

                  @excluiu BIT OUTPUT,

                  @qtRegDel SMALLINT OUTPUT,

                  @qtFun INT OUTPUT,

                  @qtCliCont INT OUTPUT,

                  @qtFornCont INT OUTPUT,

                  @qtTranspCont INT OUTPUT,

                  @id SMALLINT,

                  @idUsu INT

                  AS

                                  SET NOCOUNT ON

                   

                                  SET @excluiu=0

                                  SET @qtRegDel=0

                                  SELECT @qtFun=ISNULL(COUNT(*),0) FROM Fun WHERE idCargo=@id

                                  SELECT @qtCliCont=ISNULL(COUNT(*),0) FROM CliCont WHERE idCargo=@id

                                  SELECT @qtFornCont=ISNULL(COUNT(*),0) FROM FornCont WHERE idCargo=@id

                                  SELECT @qtTranspCont=ISNULL(COUNT(*),0) FROM TranspCont WHERE idCargo=@id

                                  IF @qtFun=0 AND @qtCliCont=0 AND @qtFornCont=0 AND @qtTranspCont=0

                                                 BEGIN

                                                                 DECLARE @gravouL BIT

                   

                                                                 EXEC SP_Cargo_Log_Incluir @gravouL OUTPUT, @id, @idUsu, 'E'

                   

                                                                 IF @gravouL=1

                                                                                 BEGIN

                                                                                                DELETE

                                                                                                FROM Cargo

                                                                                                WHERE id=@id

                   

                                                                                                SET @qtRegDel=@@ROWCOUNT

                                                                                                IF @qtRegDel>0

                                                                                                                BEGIN

                                                                                                                                SET @excluiu=1

                                                                                                                END

                                                                                 END

                                                 END

                                  RETURN

                  GO

                   

                  GRANT EXECUTE ON SP_Cargo_Excluir TO [Usuário que vai ter acesso somente de execução dessa SP]

                  GO

                  #########################################################################

                   

                   

                  At,
                  Daniel Cavalcante Scalisse
                  41-9619-5130

                  Analista de Sistemas / Coordenador de projetos

                  Skype: daniel.cavalcante.scalisse

                  LinkedIn: br.linkedin.com/pub/daniel-cavalcante-scalisse/29/191/113

                   

                  From: mssql-l@... [mailto:mssql-l@...]
                  Sent: quinta-feira, 28 de janeiro de 2016 19:23
                  To: mssql-l@...
                  Subject: RE: [mssql-l] Sp para excluir registro

                   

                   

                  Boa tarde Dalmiro,

                   

                  Mais um motivo para você deixar a constraint quieta...

                   

                  Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                   

                  Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                   

                  Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                   

                  Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                   

                  Por este motivo, lhe recomendo ficar com a opção 1

                   

                  []s

                   

                  João Polisel

                   

                  From: mssql-l@... [mailto:mssql-l@...]
                  Sent: Thursday, January 28, 2016 8:55 AM
                  To: mssql-l@...
                  Subject: RES: [mssql-l] Sp para excluir registro

                   

                   

                  Obrigado pelo retorno

                  São só 3 tabelas envolvidas.

                  Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                  Tenho 2 possibilidades...vou fazer unstestes...

                  1 – tratar cada tabela

                  2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                   

                  Irei testar

                  Obrigado

                  att

                   

                   

                  De: mssql-l@... [mailto:mssql-l@...]
                  Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                  Para: mssql-l@...
                  Assunto: Re: [mssql-l] Sp para excluir registro

                   

                   

                  Boa tarde Dalmiro,

                   

                  Analisa o impacto de recriar os indices.  

                  - Quantas tabelas estao envolvidas?

                  - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                  - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

                   

                  Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

                  Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

                   

                  Atenciosamente,
                  André Luiz R. Marques
                  Administrador de Banco de Dados - SQL Server/Oracle

                  Tel: (21) 99978-4564

                   

                  Evite imprimir. Colabore com o Meio Ambiente!

                   

                  "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                  começar agora e fazer um novo fim."

                                 Chico Xavier

                   

                  Em Sexta-feira, 22de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                   

                   

                  Boa tarde pessoal,

                  Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

                  Dúvidas

                  1 – Posso recriar a contraint com esta referencia? Como?

                  2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

                  3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

                  4 – Alguma dica?

                   

                  Obrigado

                  att

                   

                  Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                  www.avast.com

                   

                  Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                  www.avast.com

                • Dalmiro
                  Bom dia Entendi João Polisel Obrigado De: mssql-l@yahoogrupos.com.br [mailto:mssql-l@yahoogrupos.com.br] Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                  Mensagem 8 de 13 , 29 de jan 02h53min

                    Bom dia

                    Entendi João Polisel

                    Obrigado

                     

                    De: mssql-l@... [mailto:mssql-l@...]
                    Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                    Para: mssql-l@...
                    Assunto: RE: [mssql-l] Sp para excluir registro

                     

                     

                    Boa tarde Dalmiro,

                     

                    Mais um motivo para você deixar a constraint quieta...

                     

                    Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                     

                    Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                     

                    Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                     

                    Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                     

                    Por este motivo, lhe recomendo ficar com a opção 1

                     

                    []s

                     

                    João Polisel

                     

                    From: mssql-l@... [mailto:mssql-l@...]
                    Sent: Thursday, January 28, 2016 8:55 AM
                    To:
                    mssql-l@...
                    Subject: RES: [mssql-l] Sp para excluir registro

                     

                     

                    Obrigado pelo retorno

                    São só 3 tabelas envolvidas.

                    Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                    Tenho 2 possibilidades...vou fazer uns testes...

                    1 – tratar cada tabela

                    2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                     

                    Irei testar

                    Obrigado

                    att

                     

                     

                    De: mssql-l@... [mailto:mssql-l@...]
                    Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                    Para: mssql-l@...
                    Assunto: Re: [mssql-l] Sp para excluir registro

                     

                     

                    Boa tarde Dalmiro,

                     

                    Analisa o impacto de recriar os indices.  

                    - Quantas tabelas estao envolvidas?

                    - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                    - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

                     

                    Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

                    Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

                     

                    Atenciosamente,
                    André Luiz R. Marques
                    Administrador de Banco de Dados - SQL Server/Oracle

                    Tel: (21) 99978-4564

                     

                    Evite imprimir. Colabore com o Meio Ambiente!

                     

                    "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                    começar agora e fazer um novo fim."

                                   Chico Xavier

                     

                    Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                     

                     

                    Boa tarde pessoal,

                    Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

                    Dúvidas

                    1 – Posso recriar a contraint com esta referencia? Como?

                    2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

                    3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

                    4 – Alguma dica?

                     

                    Obrigado

                    att

                     

                    Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                    www.avast.com

                     

                    Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                    www.avast.com

                    Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                    www.avast.com
                  • Dalmiro
                    Obrigado Daniel De: mssql-l@yahoogrupos.com.br [mailto:mssql-l@yahoogrupos.com.br] Enviada em: sexta-feira, 29 de janeiro de 2016 02:29 Para:
                    Mensagem 9 de 13 , 1 de fev de 2016

                      Obrigado Daniel

                       

                      De: mssql-l@... [mailto:mssql-l@...]
                      Enviada em: sexta-feira, 29 de janeiro de 2016 02:29
                      Para: mssql-l@...
                      Assunto: RE: [mssql-l] Sp para excluir registro

                       

                       

                      Olá.

                      Segue script de SP que uso nas minhas aplicações e que melhoraram muito a performance.

                      Como esse modelo é executado diariamente pela aplicação, não altero nada de Constraint e Índice, mesmo porque o usuário da aplicação tem somente acesso de leitura e escrita.

                      Espero ter contribuído.

                      Aceito críticas e sugestões.

                       

                      #########################################################################

                      USE [SeuDB]

                      GO

                       

                      PRINT 'SP_Cargo_Excluir'

                      if exists (select 1 from dbo.sysobjects where id=object_id(N'SP_Cargo_Excluir') and OBJECTPROPERTY(id,N'IsProcedure')=1)

                      DROP PROCEDURE SP_Cargo_Excluir

                      GO

                       

                      CREATE PROCEDURE SP_Cargo_Excluir

                      @excluiu BIT OUTPUT,

                      @qtRegDel SMALLINT OUTPUT,

                      @qtFun INT OUTPUT,

                      @qtCliCont INT OUTPUT,

                      @qtFornCont INT OUTPUT,

                      @qtTranspCont INT OUTPUT,

                      @id SMALLINT,

                      @idUsu INT

                      AS

                                      SET NOCOUNT ON

                       

                                      SET @excluiu=0

                                      SET @qtRegDel=0

                                      SELECT @qtFun=ISNULL(COUNT(*),0) FROM Fun WHERE idCargo=@id

                                      SELECT @qtCliCont=ISNULL(COUNT(*),0) FROM CliCont WHERE idCargo=@id

                                      SELECT @qtFornCont=ISNULL(COUNT(*),0) FROM FornCont WHERE idCargo=@id

                                      SELECT @qtTranspCont=ISNULL(COUNT(*),0) FROM TranspCont WHERE idCargo=@id

                                      IF @qtFun=0 AND @qtCliCont=0 AND @qtFornCont=0 AND @qtTranspCont=0

                                                     BEGIN

                                                                     DECLARE @gravouL BIT

                       

                                                                     EXEC SP_Cargo_Log_Incluir @gravouL OUTPUT, @id, @idUsu, 'E'

                       

                                                                     IF @gravouL=1

                                                                                     BEGIN

                                                                                                    DELETE

                                                                                                    FROM Cargo

                                                                                                    WHERE id=@id

                       

                                                                                                    SET @qtRegDel=@@ROWCOUNT

                                                                                                    IF @qtRegDel>0

                                                                                                                    BEGIN

                                                                                                                                    SET @excluiu=1

                                                                                                                    END

                                                                                     END

                                                     END

                                      RETURN

                      GO

                       

                      GRANT EXECUTE ON SP_Cargo_Excluir TO [Usuário que vai ter acesso somente de execução dessa SP]

                      GO

                      #########################################################################

                       

                       

                      At,
                      Daniel Cavalcante Scalisse
                      41-9619-5130

                      Analista de Sistemas / Coordenador de projetos

                      Skype: daniel.cavalcante.scalisse

                      LinkedIn: br.linkedin.com/pub/daniel-cavalcante-scalisse/29/191/113

                       

                      From: mssql-l@... [mailto:mssql-l@...]
                      Sent: quinta-feira, 28 de janeiro de 2016 19:23
                      To:
                      mssql-l@...
                      Subject: RE: [mssql-l] Sp para excluir registro

                       

                       

                      Boa tarde Dalmiro,

                       

                      Mais um motivo para você deixar a constraint quieta...

                       

                      Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                       

                      Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                       

                      Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                       

                      Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                       

                      Por este motivo, lhe recomendo ficar com a opção 1

                       

                      []s

                       

                      João Polisel

                       

                      From: mssql-l@... [mailto:mssql-l@...]
                      Sent: Thursday, January 28, 2016 8:55 AM
                      To:
                      mssql-l@...
                      Subject: RES: [mssql-l] Sp para excluir registro

                       

                       

                      Obrigado pelo retorno

                      São só 3 tabelas envolvidas.

                      Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                      Tenho 2 possibilidades...vou fazer uns testes...

                      1 – tratar cada tabela

                      2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                       

                      Irei testar

                      Obrigado

                      att

                       

                       

                      De: mssql-l@... [mailto:mssql-l@...]
                      Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                      Para: mssql-l@...
                      Assunto: Re: [mssql-l] Sp para excluir registro

                       

                       

                      Boa tarde Dalmiro,

                       

                      Analisa o impacto de recriar os indices.  

                      - Quantas tabelas estao envolvidas?

                      - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                      - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

                       

                      Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

                      Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

                       

                      Atenciosamente,
                      André Luiz R. Marques
                      Administrador de Banco de Dados - SQL Server/Oracle

                      Tel: (21) 99978-4564

                       

                      Evite imprimir. Colabore com o Meio Ambiente!

                       

                      "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                      começar agora e fazer um novo fim."

                                     Chico Xavier

                       

                      Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                       

                       

                      Boa tarde pessoal,

                      Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

                      Dúvidas

                      1 – Posso recriar a contraint com esta referencia? Como?

                      2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

                      3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

                      4 – Alguma dica?

                       

                      Obrigado

                      att

                       

                      Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                      www.avast.com

                       

                      Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                      www.avast.com

                      Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                      www.avast.com
                    • Dalmiro
                      Boa noite... Mais algumas dúvidas...agora sobre a forma de excluir individualmente cada tabela... Primeiro, não estou conseguindo apagar o registro mesmo na
                      Mensagem 10 de 13 , 14 de mar de 2016

                        Boa noite...

                        Mais algumas dúvidas...agora sobre a forma de excluir individualmente cada tabela...

                         

                        Primeiro, não estou conseguindo apagar o registro mesmo na mão, ou seja ao excluir um registro da tabela relacionada, tabela filha, recebo a msg:

                         

                        Msg 30010, Level 16, State 1, Procedure tD_tabfilha1, Line 34

                        Cannot DELETE last tabfilha1 because tabpai exists.

                        Msg 3609, Level 16, State 1, Line 1

                        The transaction ended in the trigger. The batch has been aborted.

                         

                        Segundo, seria a avaliação do script que fiz...para fazer a limpeza das tabelas...

                        Pesquisando, vi muita gente falando que cursor não é recomendado....mas tb não consegui outra forma...

                        O que vcs acham?

                         

                         

                        USE [MeuBanco]

                        GO

                        SET ANSI_NULLS ON

                        GO

                        SET QUOTED_IDENTIFIER ON

                        GO

                         

                        ALTER PROCEDURE [dbo].[LimpaTabela]

                              @DtI        varchar(10),

                              @DtF        varchar(10),

                              @Usuario    varchar(50)

                         

                        AS

                        BEGIN

                            SET NOCOUNT ON;

                             

                              DECLARE @DI varchar(20)

                              DECLARE @DF varchar(20)

                              DECLARE @Periodo varchar(50)

                             

                              set @DI = substring(@DtI,7,4)+'-'+substring(@DtI,4,2)+'-'+substring(@DtI,1,2) + ' 00:00:00'

                             set @DF = substring(@DtF,7,4)+'-'+substring(@DtF,4,2)+'-'+substring(@DtF,1,2) + ' 23:59:59'

                         

                         

                              DECLARE @ID INTEGER

                              DECLARE TabCursor CURSOR FOR

                              select id from tabpai where dt between @DI and @DF;

                              OPEN TabCursor;  

                              FETCH NEXT FROM TabCursor INTO @ID

                              WHILE @@FETCH_STATUS = 0

                              BEGIN   

                                    Begin tran

                                          delete from tabfilha1 where id = @ID

                                          delete from tabfilha2 where id = @ID

                                          delete from tabpai where id = @ID

                                    if @@ERROR <> 0

                                          ROLLBACK

                                    else

                                          COMMIT

                                    FETCH NEXT FROM TabCursor;

                              END;

                              CLOSE TabCursor;

                              DEALLOCATE TabCursor;

                             

                        END

                         

                         

                        Obrigado

                        T+

                         

                        De: mssql-l@... [mailto:mssql-l@...]
                        Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                        Para: mssql-l@...
                        Assunto: RE: [mssql-l] Sp para excluir registro

                         

                         

                        Boa tarde Dalmiro,

                         

                        Mais um motivo para você deixar a constraint quieta...

                         

                        Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                         

                        Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                         

                        Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                         

                        Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                         

                        Por este motivo, lhe recomendo ficar com a opção 1

                         

                        []s

                         

                        João Polisel

                         

                        From: mssql-l@... [mailto:mssql-l@...]
                        Sent: Thursday, January 28, 2016 8:55 AM
                        To: mssql-l@...
                        Subject: RES: [mssql-l] Sp para excluir registro

                         

                         

                        Obrigado pelo retorno

                        São só 3 tabelas envolvidas.

                        Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                        Tenho 2 possibilidades...vou fazer uns testes...

                        1 – tratar cada tabela

                        2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                         

                        Irei testar

                        Obrigado

                        att

                         

                         

                        De: mssql-l@... [mailto:mssql-l@...]
                        Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                        Para: mssql-l@...
                        Assunto: Re: [mssql-l] Sp para excluir registro

                         

                         

                        Boa tarde Dalmiro,

                         

                        Analisa o impacto de recriar os indices.  

                        - Quantas tabelas estao envolvidas?

                        - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                        - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?

                         

                        Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.

                        Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.

                         

                        Atenciosamente,
                        André Luiz R. Marques
                        Administrador de Banco de Dados - SQL Server/Oracle

                        Tel: (21) 99978-4564

                         

                        Evite imprimir. Colabore com o Meio Ambiente!

                         

                        "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                        começar agora e fazer um novo fim."

                                       Chico Xavier

                         

                        Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                         

                         

                        Boa tarde pessoal,

                        Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.

                        Dúvidas

                        1 – Posso recriar a contraint com esta referencia? Como?

                        2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?

                        3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?

                        4 – Alguma dica?

                         

                        Obrigado

                        att

                         

                        Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                        www.avast.com

                         

                        Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                        www.avast.com


                        Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                        www.avast.com
                      • Andre Luiz Reis Marques
                        Bem, a mensagem é clara, nao permitiu que a tabela filha tivesse o registro apagado. Ha mais algum relacionamento entre a tbpai x tbfilha?  PK (tbpai) FK
                        Mensagem 11 de 13 , 14 de mar de 2016
                          Bem, a mensagem é clara, nao permitiu que a tabela filha tivesse o registro apagado.

                          Ha mais algum relacionamento entre a tbpai x tbfilha?  PK (tbpai) FK (tbfilha)
                          A ordem esta correta, logo eu entendo que pode haver um segundo relacionamento que nao foi tratado.

                          Outra coisa, sempre uso o commit como primeira opção.
                          A maioria dos compiladores entende que a primeira opção será sempre a verdadeira (minha preferencia)

                          if @@error=0
                             commit
                          else
                            rollback


                          Atenciosamente,
                          André Luiz R. Marques
                          Administrador de Banco de Dados - SQL Server/Oracle
                          Tel: (21) 99978-4564
                           
                          Evite imprimir. Colabore com o Meio Ambiente!
                           
                          "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                          começar agora e fazer um novo fim."
                                         Chico Xavier



                          Em Segunda-feira, 14 de Março de 2016 18:42, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:


                           
                          Boa noite...
                          Mais algumas dúvidas...agora sobre a forma de excluir individualmente cada tabela...
                           
                          Primeiro, não estou conseguindo apagar o registro mesmo na mão, ou seja ao excluir um registro da tabela relacionada, tabela filha, recebo a msg:
                           
                          Msg 30010, Level 16, State 1, Procedure tD_tabfilha1, Line 34
                          Cannot DELETE last tabfilha1 because tabpai exists.
                          Msg 3609, Level 16, State 1, Line 1
                          The transaction ended in the trigger. The batch has been aborted.
                           
                          Segundo, seria a avaliação do script que fiz...para fazer a limpeza das tabelas...
                          Pesquisando, vi muita gente falando que cursor não é recomendado....mas tb não consegui outra forma...
                          O que vcs acham?
                           
                           
                          USE [MeuBanco]
                          GO
                          SET ANSI_NULLS ON
                          GO
                          SET QUOTED_IDENTIFIER ON
                          GO
                           
                          ALTER PROCEDURE [dbo].[LimpaTabela]
                                @DtI        varchar(10),
                                @DtF        varchar(10),
                                @Usuario    varchar(50)
                           
                          AS
                          BEGIN
                              SET NOCOUNT ON;
                               
                                DECLARE @DI varchar(20)
                                DECLARE @DF varchar(20)
                                DECLARE @Periodo varchar(50)
                               
                                set @DI = substring(@DtI,7,4)+'-'+substring(@DtI,4,2)+'-'+substring(@DtI,1,2) + ' 00:00:00'
                               set @DF = substring(@DtF,7,4)+'-'+substring(@DtF,4,2)+'-'+substring(@DtF,1,2) + ' 23:59:59'
                           
                           
                                DECLARE @ID INTEGER
                                DECLARE TabCursor CURSOR FOR
                                select id from tabpai where dt between @DI and @DF;
                                OPEN TabCursor;  
                                FETCH NEXT FROM TabCursor INTO @ID
                                WHILE @@FETCH_STATUS = 0
                                BEGIN   
                                      Begin tran
                                            delete from tabfilha1 where id = @ID
                                            delete from tabfilha2 where id = @ID
                                            delete from tabpai where id = @ID
                                      if @@ERROR <> 0
                                            ROLLBACK
                                      else
                                            COMMIT
                                      FETCH NEXT FROM TabCursor;
                                END;
                                CLOSE TabCursor;
                                DEALLOCATE TabCursor;
                               
                          END
                           
                           
                          Obrigado
                          T+
                           
                          De: mssql-l@... [mailto:mssql-l@...]
                          Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                          Para: mssql-l@...
                          Assunto: RE: [mssql-l] Sp para excluir registro
                           
                           
                          Boa tarde Dalmiro,
                           
                          Mais um motivo para você deixar a constraint quieta...
                           
                          Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.
                           
                          Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.
                           
                          Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”
                           
                          Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.
                           
                          Por este motivo, lhe recomendo ficar com a opção 1
                           
                          []s
                           
                          João Polisel
                           
                          From: mssql-l@... [mailto:mssql-l@...]
                          Sent: Thursday, January 28, 2016 8:55 AM
                          To: mssql-l@...
                          Subject: RES: [mssql-l] Sp para excluir registro
                           
                           
                          Obrigado pelo retorno
                          São só 3 tabelas envolvidas.
                          Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.
                          Tenho 2 possibilidades...vou fazer uns testes...
                          1 – tratar cada tabela
                          2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...
                           
                          Irei testar
                          Obrigado
                          att
                           
                           
                          De: mssql-l@... [mailto:mssql-l@...]
                          Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                          Para: mssql-l@...
                          Assunto: Re: [mssql-l] Sp para excluir registro
                           
                           
                          Boa tarde Dalmiro,
                           
                          Analisa o impacto de recriar os indices.  
                          - Quantas tabelas estao envolvidas?
                          - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!
                          - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?
                           
                          Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.
                          Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.
                           
                          Atenciosamente,
                          André Luiz R. Marques
                          Administrador de Banco de Dados - SQL Server/Oracle
                          Tel: (21) 99978-4564
                           
                          Evite imprimir. Colabore com o Meio Ambiente!
                           
                          "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                          começar agora e fazer um novo fim."
                                         Chico Xavier
                           
                          Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:
                           
                           
                          Boa tarde pessoal,
                          Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.
                          Dúvidas
                          1 – Posso recriar a contraint com esta referencia? Como?
                          2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?
                          3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?
                          4 – Alguma dica?
                           
                          Obrigado
                          att
                           
                          Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                          www.avast.com

                          Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                          www.avast.com


                        • Dalmiro
                          André, obrigado pelo retorno... Localizei o problema, tem uma trigger travando...td_filha1 As tabelas foram criadas através do Erwin....fui ver a geração e
                          Mensagem 12 de 13 , 21 de mar de 2016

                            André, obrigado pelo retorno...

                            Localizei o problema, tem uma trigger travando...td_filha1

                            As tabelas foram criadas através do Erwin....fui ver a geração e realmente a trigger é criada

                            Não sei porque o Erwin cria esta trigger, deve ser alguma segurança...

                            Retirei a trigger e funcionou o processo.....

                            Obrigado irei aplicar a sua sugestão....

                             

                            De: mssql-l@... [mailto:mssql-l@...]
                            Enviada em: segunda-feira, 14 de março de 2016 19:14
                            Para: mssql-l@...
                            Assunto: Re: RES: [mssql-l] Sp para excluir registro

                             

                             

                            Bem, a mensagem é clara, nao permitiu que a tabela filha tivesse o registro apagado.

                             

                            Ha mais algum relacionamento entre a tbpai x tbfilha?  PK (tbpai) FK (tbfilha)

                            A ordem esta correta, logo eu entendo que pode haver um segundo relacionamento que nao foi tratado.

                             

                            Outra coisa, sempre uso o commit como primeira opção.

                            A maioria dos compiladores entende que a primeira opção será sempre a verdadeira (minha preferencia)

                             

                            if @@error=0

                               commit

                            else

                              rollback

                             

                             

                            Atenciosamente,
                            André Luiz R. Marques
                            Administrador de Banco de Dados - SQL Server/Oracle

                            Tel: (21) 99978-4564

                             

                            Evite imprimir. Colabore com o Meio Ambiente!

                             

                            "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                            começar agora e fazer um novo fim."

                                           Chico Xavier

                             

                            Em Segunda-feira, 14 de Março de 2016 18:42, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:

                             

                             

                            Boa noite...

                            Mais algumas dúvidas...agora sobre a forma de excluir individualmente cada tabela...

                             

                            Primeiro, não estou conseguindo apagar o registro mesmo na mão, ou seja ao excluir um registro da tabela relacionada, tabela filha, recebo a msg:

                             

                            Msg 30010, Level 16, State 1, Procedure tD_tabfilha1, Line 34

                            Cannot DELETE last tabfilha1 because tabpai exists.

                            Msg 3609, Level 16, State 1, Line 1

                            The transaction ended in the trigger. The batch has been aborted.

                             

                            Segundo, seria a avaliação do script que fiz...para fazer a limpeza das tabelas...

                            Pesquisando, vi muita gente falando que cursor não é recomendado....mas tb não consegui outra forma...

                            O que vcs acham?

                             

                             

                            USE [MeuBanco]

                            GO

                            SET ANSI_NULLS ON

                            GO

                            SET QUOTED_IDENTIFIER ON

                            GO

                             

                            ALTER PROCEDURE [dbo].[LimpaTabela]

                                  @DtI        varchar(10),

                                  @DtF        varchar(10),

                                  @Usuario    varchar(50)

                             

                            AS

                            BEGIN

                                SET NOCOUNT ON;

                                 

                                  DECLARE @DI varchar(20)

                                  DECLARE @DF varchar(20)

                                  DECLARE @Periodo varchar(50)

                                 

                                  set @DI = substring(@DtI,7,4)+'-'+substring(@DtI,4,2)+'-'+substring(@DtI,1,2) + ' 00:00:00'

                                 set @DF = substring(@DtF,7,4)+'-'+substring(@DtF,4,2)+'-'+substring(@DtF,1,2) + ' 23:59:59'

                             

                             

                                  DECLARE @ID INTEGER

                                  DECLARE TabCursor CURSOR FOR

                                  select id from tabpai where dt between @DI and @DF;

                                  OPEN TabCursor;  

                                  FETCH NEXT FROM TabCursor INTO @ID

                                  WHILE @@FETCH_STATUS = 0

                                  BEGIN   

                                        Begin tran

                                              delete from tabfilha1 where id = @ID

                                              delete from tabfilha2 where id = @ID

                                              delete from tabpai where id = @ID

                                        if @@ERROR <> 0

                                              ROLLBACK

                                        else

                                              COMMIT

                                        FETCH NEXT FROM TabCursor;

                                  END;

                                  CLOSE TabCursor;

                                  DEALLOCATE TabCursor;

                                 

                            END

                             

                             

                            Obrigado

                            T+

                             

                            De: mssql-l@... [mailto:mssql-l@...]
                            Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                            Para: mssql-l@...
                            Assunto: RE: [mssql-l] Sp para excluir registro

                             

                             

                            Boa tarde Dalmiro,

                             

                            Mais um motivo para você deixar a constraint quieta...

                             

                            Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.

                             

                            Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.

                             

                            Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”

                             

                            Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.

                             

                            Por este motivo, lhe recomendo ficar com a opção 1

                             

                            []s

                             

                            João Polisel

                             

                            From: mssql-l@... [mailto:mssql-l@...]
                            Sent: Thursday, January 28, 2016 8:55 AM
                            To: mssql-l@...
                            Subject: RES: [mssql-l] Sp para excluir registro

                             

                             

                            Obrigado pelo retorno

                            São só 3 tabelas envolvidas.

                            Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.

                            Tenho 2 possibilidades...vou fazer uns testes...

                            1 – tratar cada tabela

                            2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...

                             

                            Irei testar

                            Obrigado

                            att

                             

                             

                            De: mssql-l@... [mailto:mssql-l@...]
                            Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                            Para: mssql-l@...
                            Assunto: Re: [mssql-l] Sp para excluir registro

                             

                             

                            Boa tarde Dalmiro,

                             

                            Analisa o impacto de recriar os indices.  

                            - Quantas tabelas estao envolvidas?

                            - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!

                          • Andre Luiz Reis Marques
                            Legal, Sempre ha um detalhe que nos faz perder tempo. Atenciosamente, André Luiz R. Marques Administrador de Banco de Dados - SQL Server/OracleTel: (21)
                            Mensagem 13 de 13 , 21 de mar de 2016
                              Legal,

                              Sempre ha um detalhe que nos faz perder tempo.
                               
                              Atenciosamente,
                              André Luiz R. Marques
                              Administrador de Banco de Dados - SQL Server/Oracle
                              Tel: (21) 99978-4564
                               
                              Evite imprimir. Colabore com o Meio Ambiente!
                               
                              "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                              começar agora e fazer um novo fim."
                                             Chico Xavier



                              Em Segunda-feira, 21 de Março de 2016 9:46, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:


                               
                              André, obrigado pelo retorno...
                              Localizei o problema, tem uma trigger travando...td_filha1
                              As tabelas foram criadas através do Erwin....fui ver a geração e realmente a trigger é criada
                              Não sei porque o Erwin cria esta trigger, deve ser alguma segurança...
                              Retirei a trigger e funcionou o processo.....
                              Obrigado irei aplicar a sua sugestão....
                               
                              De: mssql-l@... [mailto:mssql-l@...]
                              Enviada em: segunda-feira, 14 de março de 2016 19:14
                              Para: mssql-l@...
                              Assunto: Re: RES: [mssql-l] Sp para excluir registro
                               
                               
                              Bem, a mensagem é clara, nao permitiu que a tabela filha tivesse o registro apagado.
                               
                              Ha mais algum relacionamento entre a tbpai x tbfilha?  PK (tbpai) FK (tbfilha)
                              A ordem esta correta, logo eu entendo que pode haver um segundo relacionamento que nao foi tratado.
                               
                              Outra coisa, sempre uso o commit como primeira opção.
                              A maioria dos compiladores entende que a primeira opção será sempre a verdadeira (minha preferencia)
                               
                              if @@error=0
                                 commit
                              else
                                rollback
                               
                               
                              Atenciosamente,
                              André Luiz R. Marques
                              Administrador de Banco de Dados - SQL Server/Oracle
                              Tel: (21) 99978-4564
                               
                              Evite imprimir. Colabore com o Meio Ambiente!
                               
                              "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                              começar agora e fazer um novo fim."
                                             Chico Xavier
                               
                              Em Segunda-feira, 14 de Março de 2016 18:42, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:
                               
                               
                              Boa noite...
                              Mais algumas dúvidas...agora sobre a forma de excluir individualmente cada tabela...
                               
                              Primeiro, não estou conseguindo apagar o registro mesmo na mão, ou seja ao excluir um registro da tabela relacionada, tabela filha, recebo a msg:
                               
                              Msg 30010, Level 16, State 1, Procedure tD_tabfilha1, Line 34
                              Cannot DELETE last tabfilha1 because tabpai exists.
                              Msg 3609, Level 16, State 1, Line 1
                              The transaction ended in the trigger. The batch has been aborted.
                               
                              Segundo, seria a avaliação do script que fiz...para fazer a limpeza das tabelas...
                              Pesquisando, vi muita gente falando que cursor não é recomendado....mas tb não consegui outra forma...
                              O que vcs acham?
                               
                               
                              USE [MeuBanco]
                              GO
                              SET ANSI_NULLS ON
                              GO
                              SET QUOTED_IDENTIFIER ON
                              GO
                               
                              ALTER PROCEDURE [dbo].[LimpaTabela]
                                    @DtI        varchar(10),
                                    @DtF        varchar(10),
                                    @Usuario    varchar(50)
                               
                              AS
                              BEGIN
                                  SET NOCOUNT ON;
                                   
                                    DECLARE @DI varchar(20)
                                    DECLARE @DF varchar(20)
                                    DECLARE @Periodo varchar(50)
                                   
                                    set @DI = substring(@DtI,7,4)+'-'+substring(@DtI,4,2)+'-'+substring(@DtI,1,2) + ' 00:00:00'
                                   set @DF = substring(@DtF,7,4)+'-'+substring(@DtF,4,2)+'-'+substring(@DtF,1,2) + ' 23:59:59'
                               
                               
                                    DECLARE @ID INTEGER
                                    DECLARE TabCursor CURSOR FOR
                                    select id from tabpai where dt between @DI and @DF;
                                    OPEN TabCursor;  
                                    FETCH NEXT FROM TabCursor INTO @ID
                                    WHILE @@FETCH_STATUS = 0
                                    BEGIN   
                                          Begin tran
                                                delete from tabfilha1 where id = @ID
                                                delete from tabfilha2 where id = @ID
                                                delete from tabpai where id = @ID
                                          if @@ERROR <> 0
                                                ROLLBACK
                                          else
                                                COMMIT
                                          FETCH NEXT FROM TabCursor;
                                    END;
                                    CLOSE TabCursor;
                                    DEALLOCATE TabCursor;
                                   
                              END
                               
                               
                              Obrigado
                              T+
                               
                              De: mssql-l@... [mailto:mssql-l@...]
                              Enviada em: quinta-feira, 28 de janeiro de 2016 20:23
                              Para: mssql-l@...
                              Assunto: RE: [mssql-l] Sp para excluir registro
                               
                               
                              Boa tarde Dalmiro,
                               
                              Mais um motivo para você deixar a constraint quieta...
                               
                              Quando você cria a constraint em uma tabela que já tem dados o SQL Server tem que garantir que os dados que já existem na tabela não violam a constraint.
                               
                              Para uma Foreign Key, isso consiste em verificar que não há registros orfãos (existe apenas na tabela filha) e isso pode ser pesado dependendo do volume de dados.
                               
                              Se você apenas desabilitar a constraint, quando habilita-la novamente precisa especificar que o SQL Server faça essa verficação, caso contrário a constraint se torna “untrusted” ou “não confiável”
                               
                              Quando você tem constraints untrusted em seu banco de dados o otimizador de consultas deixa de aplicar algumas otimizações resultando em planos de execução mais pobres e com pior performance.
                               
                              Por este motivo, lhe recomendo ficar com a opção 1
                               
                              []s
                               
                              João Polisel
                               
                              From: mssql-l@... [mailto:mssql-l@...]
                              Sent: Thursday, January 28, 2016 8:55 AM
                              To: mssql-l@...
                              Subject: RES: [mssql-l] Sp para excluir registro
                               
                               
                              Obrigado pelo retorno
                              São só 3 tabelas envolvidas.
                              Teoricamente só uma pessoa vai rodar esta SP e poucas vezes, pois quando o usuário achar um bom momento para a limpeza irá executar.
                              Tenho 2 possibilidades...vou fazer uns testes...
                              1 – tratar cada tabela
                              2 – na sp, alterar a constraint para deixar apagar por cascata e no final do processo voltar a constraint para a forma normal...
                               
                              Irei testar
                              Obrigado
                              att
                               
                               
                              De: mssql-l@... [mailto:mssql-l@...]
                              Enviada em: sexta-feira, 22 de janeiro de 2016 14:16
                              Para: mssql-l@...
                              Assunto: Re: [mssql-l] Sp para excluir registro
                               
                               
                              Boa tarde Dalmiro,
                               
                              Analisa o impacto de recriar os indices.  
                              - Quantas tabelas estao envolvidas?
                              - Voce pode quebrar as constrais (drop), rodar um truncate nas tabelas envolvidas e depois criar os inices novamente, fica mais rapido.  MAS!!!
                              - O objetivo e apagar todo o conteudo? ou ha alguma regra de negocio que deva ser respeidata?
                               
                              Nos conte um pouco mais sobre a sua necessidade, este procedimento sempre ira se repetir, se sim a procedure ja é um bom caminho.
                              Caso contrario, ve as tabelas envolvidas de executa o drop das contrains e trunca as tabelas.
                               
                              Atenciosamente,
                              André Luiz R. Marques
                              Administrador de Banco de Dados - SQL Server/Oracle
                              Tel: (21) 99978-4564
                               
                              Evite imprimir. Colabore com o Meio Ambiente!
                               
                              "Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode
                              começar agora e fazer um novo fim."
                                             Chico Xavier
                               
                              Em Sexta-feira, 22 de Janeiro de 2016 13:18, "'Dalmiro' dalmiroy@... [mssql-l]" <mssql-l@...> escreveu:
                               
                               
                              Boa tarde pessoal,
                              Tenho que criar uma sp, para exclusão de registros, mas a tabela principal tem relação com outras 2 tabelas e estas relações não foram criadas com referencias on delete cascade.
                              Dúvidas
                              1 – Posso recriar a contraint com esta referencia? Como?
                              2 – Uma saída é fazer um select e depois loop e deletar os registros das tabelas relacionadas e depois a principal, é uma boa saída?
                              3 – Para opção 2 como faço para colocar transação pois acho melhor para cada volta do loop, fazer o controle da transação, e uma boa?
                              4 – Alguma dica?
                               
                              Obrigado
                              att
                               

                              Este e-mail foi enviado por um computador sem vírus e protegido pelo Avast.
                              www.avast.com
                            Sua mensagem foi enviada com êxito e será entregue aos destinatários em breve.