Opa Tiago, boa noite. Desculpe não retornar antes.
O script abaixo, é um exemplo que criei para simular as diferenças de
comportamento. Fiz a correção na Foreign Key da tabela filho para postergar
a verificação e deu certo, como marquei no script abaixo em "vermelho".
O grande problema que tenho no momento, de comportamento diferente, é a
trigger da tabela filho, se precisar recuperar algo na tabela pai no
registro que ainda está para ser confirmado, isso ele retorna NULL, sendo
que o mesmo script no banco 7.4 funciona normalmente.


CREATE TABLE qion.tab_pai (
  tp_id BIGINT DEFAULT nextval('qion.tab_pai_id_seq'::regclass) NOT NULL,
  tp_descricao VARCHAR(50) NOT NULL,
  tp_data DATE,
  tp_valor MONEY,
  CONSTRAINT tab_pai_pkey PRIMARY KEY(tp_id)
)
WITH (oids = false);

CREATE TABLE qion.tab_filho (
  tf_id BIGSERIAL,
  tf_tb_id BIGINT NOT NULL,
  tf_data DATE,
  tf_confirmacao_trigger_pai_id BIGINT,
  CONSTRAINT tab_filho_pkey PRIMARY KEY(tf_id),
  CONSTRAINT tab_filho_fk FOREIGN KEY (tf_tb_id)
    REFERENCES qion.tab_pai(tp_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
   * DEFERRABLE*
*    INITIALLY DEFERRED*
)
WITH (oids = false);

CREATE OR REPLACE FUNCTION public.f_tab_pai (
)
RETURNS trigger AS
$body$
DECLARE
  vVariavel INTEGER;
  rRecord RECORD;

BEGIN

   INSERT INTO qion.tab_filho
   (tf_tb_id,tf_data)
   VALUES
   (NEW.tp_id,
    CURRENT_DATE
    );

   RETURN NEW ;

END ;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



CREATE TRIGGER tab_pai_tr
  BEFORE INSERT
  ON qion.tab_pai FOR EACH ROW
  EXECUTE PROCEDURE public.f_tab_pai();



CREATE OR REPLACE FUNCTION public.f_tab_filho (
)
RETURNS trigger AS
$body$
DECLARE
  rRecord RECORD;

BEGIN
  SELECT INTO rRecord tp_id,tp_data FROM qion.tab_pai WHERE
tp_id=NEW.tf_tb_id;
  -- Aqui nesse suposto exemplo de resgatar o valor do registro que ainda
não foi confirmado na tabela pai, por alguma
  -- necessidade para que essa trigger funcione, o valor que retorna é
NULL, diferentemente dessa mesma estrutura rodando
  --em um banco 7.4.30.
  --mesmo que essa trigger seja alterada para AFTER, não funciona.

   raise exception 'rRecord.tp_id % tp_data
%',rRecord.tp_id,rrecord.tp_data; -- NULL,NULL seria o retorno

   NEW.tf_confirmacao_trigger_pai_id=rRecord.tp_id;

   RETURN NEW ;

END ;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


CREATE TRIGGER tab_filho_tr
  BEFORE INSERT
  ON qion.tab_filho FOR EACH ROW
  EXECUTE PROCEDURE public.f_tab_filho();



-----------------------------------------------
Obrigado...



*José  Henrique Beraldo*
Tel: 017 3331-7770
Cel: 017 99979-4669

*Linkedin   **linkedin.com/in/josehenriqueberaldo
<http://www.linkedin.com/in/josehenriqueberaldo>*

*Twitter      @henriqueberaldo*

*Facebook facebook.com/henriqueberaldo
<http://facebook.com/henriqueberaldo>*

*Skype        josehenriqueberaldo*




Em 17 de novembro de 2015 22:25, Tiago José Adami <[email protected]>
escreveu:

>
> Em 17/11/2015 8:16 PM, "José Henrique Beraldo" <[email protected]>
> escreveu:
> >
> > Boa noite.
> > Estou fazendo uma manutenção em um banco de dados 7.4 que foi migrado
> para o 9.4, e o comportamento das triggers mudou.
> > O que percebi é que triggers que funcionam no 7.4 se comportam diferente
> na versão 9.5, por exemplo:
> > 1) quando a tabela pai tem uma trigger que escreve na tabela filho, e a
> tabela filho, normalmente tem uma foreign key do pai, ai dá o erro de
> verificação da constraint.
> > Outro problema que ví, é que na trigger before do pai, ele escreve na
> tabela filho, e na tabela filho tem uma trigger after que precisa coletar o
> registro que ainda está em New da tabela pai, e esse registro não é
> encontrado, diferentemente do 7.4.
> > Preciso reescrever ou há alguma coisa que possa fazer?
> > Obrigado.
> >
> Pelo o que entendi, se o disparo "do" trigger (tradução: gatilho) na
> tabela pai for Before Insert, este comportamento é esperado.
>
> A solução que imagino é alterar o trigger para after Insert na tabela pai.
> Poste o código para que eu e os demais colegas da lista possamos visualizar
> uma possível solução, só pela explicação ficou um pouco difícil de
> entender.
>
> Tiago J. Adami
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a