Usuário com melhor resposta
cursor em trigger

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
GOGrata!!!!
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
-
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
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
-
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
-
-