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

33188RES: RES: [mssql-l] Sp para excluir registro

Expandir mensagens
  • Dalmiro
    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!!!

    • Mostrar todas as 13 mensagens neste tópico