*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

Responder a