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

33189Re: RES: RES: [mssql-l] Sp para excluir registro

Expandir mensagens
  • Andre Luiz Reis Marques
    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
    • Mostrar todas as 13 mensagens neste tópico