none
cursor em trigger RRS feed

  • Pergunta

  • Caros colegas, tenho uma tabela com 3 campos , nuprocesso, sequencial e dsprocesso. Os campos nuprocesso e sequencial   são chave primária. O campo nuprocesso é alimentado pelo usuário, porém o sequencial deverá ser alimentado pelo banco.

    Ficaria assim então:

    nuprocesso     sequencial

    1 1

    1 2

    1 3

    2 1

    2 2

    E assim por diante.

    Criei uma trigger de inserção para alimentar o valor do sequencial, dá certo quando é um registro só, mas quando incluo vários registros de uma vez só dá problema. Estou inserindo 3 registros de uma vez e a trigger está jogando 9 registros, cada registro ela inclui 3 vezes e com sequencial identico.  Vai a trigger abaixo:                  

    CREATE TRIGGER [dbo].[processo] 
    ON [dbo].[processo]
    instead of insert
    AS 
    BEGIN 
    DECLARE
    @nuprocesso numeric(2),
    @sequencial smallint, 
    @cont smallint

    declare cursor_processo cursor for 
    SELECT   nuprocesso froM inserted
    open cursor_processo
    fetch next from cursor_processo  into   @nuprocesso 
    while @@FETCH_STATUS = 0

    begin
    set @cont  = (select COUNT(*) from processo where nuprocesso = @nuprocesso)

    if @cont = 0 
                 begin
           set @sequencial = 1
         end;

    if @cont > 0
               begin
                 set  @sequencial = (select  max(sequencial) + 1 from processo where nuprocesso = @nuprocesso)
               end;

                   insert into processo (nuprocesso, sequencial, dsprocesso) select nuprocesso, @sequencial, dsprocesso from inserted ;

    fetch next from cursor_passoprocesso_insert  into @nuprocesso 
            end
    end
    close cursor_processo

    deallocate  cursor_processo
    GO

    Grata!!!!


    quarta-feira, 31 de agosto de 2016 19:35

Respostas

  • Deleted
    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    segunda-feira, 12 de setembro de 2016 22:09
  • LaraW, bom dia.

    O problema está justamente no INSERT com o SELECT da tabela INSERTED. Quando você insere 3 registros (como você mencionou) a tabela INSERTED terá esses 3 registros e como seu cursor será executado para cada linha, então para cada execução do cursor ele incluirá todos os registros da tabela INSERTED.

    Não sei exatamente como está a estrutura da tabela e a regra de negócio, mas você pode adicionar uma condição (WHERE) no SELECT da INSERTED com um código único (se possível) ou então tratar a tabela INSERTED usando a função ROW_NUMBER.

    Espero ter ajudado.

    Abraço.


    Ruicci

    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    quinta-feira, 1 de setembro de 2016 04:43
  • LaraW,

    Será que realmente o cursor é a solução?

    Talvez pensando um pouco e analisando o cenário, você poderia pensar em utilizar a cláusula Output introduzida no SQL Server a partir da versão 2008 que nos permite justamente obter os valores de dados existente em cada operação de Insert, Update e Delete, além disso, estes valores podem  ser armanezados em outras tabelas, bem como, apresentados em tela durante o processamento.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    quinta-feira, 1 de setembro de 2016 15:25

Todas as Respostas

  • LaraW, bom dia.

    O problema está justamente no INSERT com o SELECT da tabela INSERTED. Quando você insere 3 registros (como você mencionou) a tabela INSERTED terá esses 3 registros e como seu cursor será executado para cada linha, então para cada execução do cursor ele incluirá todos os registros da tabela INSERTED.

    Não sei exatamente como está a estrutura da tabela e a regra de negócio, mas você pode adicionar uma condição (WHERE) no SELECT da INSERTED com um código único (se possível) ou então tratar a tabela INSERTED usando a função ROW_NUMBER.

    Espero ter ajudado.

    Abraço.


    Ruicci

    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    quinta-feira, 1 de setembro de 2016 04:43
  • LaraW,

    Será que realmente o cursor é a solução?

    Talvez pensando um pouco e analisando o cenário, você poderia pensar em utilizar a cláusula Output introduzida no SQL Server a partir da versão 2008 que nos permite justamente obter os valores de dados existente em cada operação de Insert, Update e Delete, além disso, estes valores podem  ser armanezados em outras tabelas, bem como, apresentados em tela durante o processamento.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    quinta-feira, 1 de setembro de 2016 15:25
  • Deleted
    • Marcado como Resposta LaraW terça-feira, 13 de setembro de 2016 16:42
    segunda-feira, 12 de setembro de 2016 22:09
  •       Obrigada a todos, realmente estava usando cursor e tabela inserted ao mesmo tempo.

          E vou dar uma olhada na clausula OUTPUT.

    Valeu demais!!!!

    terça-feira, 13 de setembro de 2016 16:44