*Douglas!*
Eu consegui simular o caso e achei uma solução.
Como citei no e-mail anterior, criei um campo na tabela que identifica
quando o registro é inserido pela trigger e quando é inserido pela
aplicação, em seguida tratei o caso com um IF dentro da trigger.
Compile o script em uma base em branco e faça os testes que necessitar.
Caso ainda necessite de apoio, me contate.
*Atenciosamente.*
*Alan Formagi*
*(47) 92034013 - Vivo*
Em 1 de julho de 2015 12:59, Alan Formagi <[email protected]> escreveu:
> *Boa tarde Douglas!*
>
> Pelo o que eu entendo essa estrutura vai ficar em loop.
> Toda vez que você inserir um registro a trigger tentará inserir
> outros, que por consequência irão disparar a mesma trigger, criando uma
> "pilha". Sendo que é justamente isso que o postgres está reclamando quando
> te pede para incrementar a configuração max_stack_depth (
> http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html).
> Uma solução é você adicionar um campo na tabela que identifique quando
> o registro é inserido pela trigger e quando é inserido pelo programa, e a
> partir disso fazer um tratamento dentro da função da trigger.
> Assim que eu tiver uns minutos eu vou tentar simular o caso na minha
> máquina, e se eu conseguir eu te mando um exemplo da solução.
>
> *Atenciosamente.*
>
> *Alan Formagi*
> *(47) 92034013 - Vivo*
>
> 2015-07-01 11:43 GMT-03:00 Douglas Fabiano Specht <
> [email protected]>:
>
>>
>> Pessoal
>> preciso gerar uma trigger que quando tiver um insert ele duplique mais x
>> vezes conforme o max de uma outra tabela, acho que esta em loop infinito,
>> pois me da um erro: ERROR: stack depth limit exceeded
>> HINT: Increase the configuration parameter "max_stack_depth" (currently
>> 2048kB), after ensuring the platform's stack depth limit is adequate.
>>
>> estou apanhando..alguem poderia me ajudar?
>> postgres 9.4
>>
>>
>> CREATE OR REPLACE FUNCTION dah.wdetcad() RETURNS TRIGGER AS $body$
>> declare
>> i integer;
>>
>> BEGIN
>> for i in 1..(select max(codempresa) from configura WHERE codhotel >1)
>> loop
>> INSERT INTO detcad
>> select i, new.codgrupo, new.codfuncresp ;
>> end loop;
>>
>> RETURN NEW();
>> END;
>> $body$
>> LANGUAGE plpgsql;
>>
>> --
>>
>> Douglas Fabiano Specht
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
--drop table config;
create table config (
num_max smallint);
insert into config(num_max) values(3);
--update config set num_max = 5;
--drop sequence sequencial;
CREATE SEQUENCE sequencial
INCREMENT 1
MINVALUE 1
MAXVALUE 999999
START 1
CACHE 1;
--drop table nomes;
create table nomes (
codigo bigint DEFAULT nextval('sequencial'::regclass)
,nome character varying (100)
,tipo boolean DEFAULT true);
--drop function inserir_nomes();
CREATE OR REPLACE FUNCTION inserir_nomes()
RETURNS trigger AS
$BODY$
Declare
_maximo smallint;
_nome nomes.nome%type;
_tipo boolean;
Begin
_tipo := NEW.tipo;
IF _tipo THEN
SELECT num_max
INTO _maximo
FROM config;
_nome := NEW.nome;
-- o seu máximo é 3, mas 1 registro você já inseriu
FOR i IN 1..(_maximo-1) LOOP
INSERT
INTO nomes(nome, tipo)
VALUES(_nome, false);
END LOOP;
END IF;
return new;
End;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
--DROP TRIGGER trg_inserir_max ON nomes;
CREATE TRIGGER trg_inserir_max
AFTER INSERT
ON NOMES
FOR EACH ROW
EXECUTE PROCEDURE inserir_nomes();
--insert into nomes(nome) values('Douglas Fabian Specht');
--select * from nomes;_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral