none
Criar Trigger no SqlExpress para limpar tabela Temporaria RRS feed

  • Pergunta

  • Boa noite, estou fazendo um programa onde eu tenho uma tabela temporaria para armazenar os dados de uma venda, eu vou adicionando itens e salvando na tabela temporaria, apos terminar de inserir os intens da venda eu faço um insert na minha tabela itens de venda e tenho que limpar os dados da tabela temporaria com uma trigger, pois ela precisa estar limpa para a proxima venda, ma tabela TEMPORARIA eu tenho os seguintes atributos da venda

    CodigoTBLtemporaria int

    CodigoDaVenda         int;

    CodigoDoProduto      int;

    Quantidade               int;

    ValorTotal                Decimal;

    Preciso deletar todos esses dados na Temporaria, lembrando que eu posso ter vairas linhas de itens, preciso fazer isso com uma trigger,ela ja esta salvando na tabela de itens porem nao consigo limpar a tabela, ajudem por favor, desde ja muito obrigada

    segunda-feira, 19 de novembro de 2012 22:30

Respostas

  • Colega, acho a ideia da criação da Trigger uma péssima ideia.

    Se, em algum momento, você já faz a inserção dos dados na tabela física, imediatamente após esta inserção faça a limpeza da tabela temporária, com um Truncate (como sugerido pelo Fabio).

    Na verdade esse tipo de recurso é muito pouco utilizado. Normalmente usam-se tabelas temporárias locais para isso (somente uma #). E já que a tabela é local, significa que ela é "sua" (da sua sessão). E se ela é "sua", destrua e recrie a tabela.

    Ou seja, no início do seu procedimento terá, em algum momento, um Create table #Tabela (...). No final do procedimento de gravação na tabela física terá um Drop Table #Tabela.

    Assim você garante inclusive que nenhum lixo ficará para trás.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 20 de novembro de 2012 15:24
    Moderador

Todas as Respostas

  • Você pode colocar na trigger para após o insert na tabela de vendas a trigger dar um delete na tabela temporária

    DELETE FROM TEMPORARIA
    Assim a trigger irá apagar todos os registros da tabela temporária.



    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 19 de novembro de 2012 22:38
  • Boa noite!

    Tal ação até é possivel e permitida, basta fazer como  o Marcos disse e colocar um Delete na tabela temporaria. Todo caso tome cuidado pois a tabela temporaria só existe na sessão (Ou Global, mas ainda sim se a sessão que a criou cair ou deslogar a mesma deixa de existir), então para se evitar erros coloque uma validação antes:

    IF(EXISTS(SELECT TOP 1 1 FROM tempdb.sys.tables WHERE name LIKE '#TabelaTemporaria'))

    DELETE FROM #TabelaTemporaria

    Como curiosidade, TOP 1 1 não tem diferença nenhuma de performance é apenas uma padrão meu de programação de validação de existencia visando facilidade na leitura do codigo.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 20 de novembro de 2012 01:28
    Moderador
  • tudo bem eu ate sei que tenho que colocar uma trigger apos o insert, o problema é que nao sei fazer  essa trigger =/ , podem dar um exemplo por favor?

    e como  e onde fazer essas trigger? é no codigo? eh na tabela?????


    terça-feira, 20 de novembro de 2012 02:19
  • Cara, seja um pouco mais específico. 

    Talvez vc não precise exatamente de uma trigger para essa finalidade, talvez a inserção de um

    TRUNCATE TABLE <noma_tabela>

    no script mesmo, antes de começar a inserção.

    Alguns pontos no seu questionamento podem direcionar a uma nova solução ao invés da trigger, por exemplo; "..Gatilhos DML não podem ser definidos em tabelas temporárias locais ou globais." (http://msdn.microsoft.com/pt-br/library/ms189799.aspx)

    Dê mais exemplos, ou poste mais do seu script para podermos ter uma visão mais ampla da sua intenção!!!

    Abs,

    terça-feira, 20 de novembro de 2012 04:28
  • Segue um exemplo de script da trigger.

    CREATE TRIGGER I_Insercao ON Tabela
    FOR INSERT
    AS
    IF(EXISTS(SELECT TOP 1 1 FROM tempdb.sys.tables WHERE name LIKE '#TabelaTemporaria'))
    DELETE FROM #TabelaTemporaria


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 20 de novembro de 2012 11:15
    Moderador
  • Colega, acho a ideia da criação da Trigger uma péssima ideia.

    Se, em algum momento, você já faz a inserção dos dados na tabela física, imediatamente após esta inserção faça a limpeza da tabela temporária, com um Truncate (como sugerido pelo Fabio).

    Na verdade esse tipo de recurso é muito pouco utilizado. Normalmente usam-se tabelas temporárias locais para isso (somente uma #). E já que a tabela é local, significa que ela é "sua" (da sua sessão). E se ela é "sua", destrua e recrie a tabela.

    Ou seja, no início do seu procedimento terá, em algum momento, um Create table #Tabela (...). No final do procedimento de gravação na tabela física terá um Drop Table #Tabela.

    Assim você garante inclusive que nenhum lixo ficará para trás.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 20 de novembro de 2012 15:24
    Moderador
  • Galera,

    Ao meu ver as questões que temos que analisar são:

    1 - Porque utilizar uma tabela temporária?

    2 - Porque limpar esta tabela?

    Se as mesma vai ser excluída ou terá o seu conteúdo excluído, não seria melhor utilizar uma Variável Table ou até mesmo uma Tabela Auxiliar no banco de dados?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 21 de novembro de 2012 16:22