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

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

Expandir mensagens
  • Dalmiro
    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
    • Mostrar todas as 13 mensagens neste tópico