2008/9/16 Mozart Hasse <[EMAIL PROTECTED]>

> William,
>
> > From: "Mozart Hasse" <[EMAIL PROTECTED]>
> >
> >     Bom, quando eu usei rules em views que eram simplesmente copias da
> > tabela original, as mesmas eram :
> >
> > CREATE RULE [nome] AS ON INSERT TO [nome view] DO INSTEAD INSERT INTO
> > [tabela original](COALESCE(new.[campo1],
> > DEFAULT),COALESCE(new.[campo2],DEFAULT),...);
> >
> >      E funcionavam certinho. Item para ocaso do update. Havia a
> facilidade
> > de um ID de registro nunca poder ser alterado. Assim "... DO INSTEAD
> UPDATE
> > [tabela original] SET [campo1] = new.[campo1] ... WHERE ID = new.[ID]
> sempre
> > funcionava.
>
> Eu tentei isso:
>
> create or replace view public.MVTOESTQ as
> SELECT * FROM GESTAO.MVTOESTQ;
>
> -- coloquei tudo o que foi possível (NEW.x := y) nas triggers before insert
> CREATE TRIGGER tr_mvtoestq_bupde
>  BEFORE DELETE OR UPDATE
>  ON gestao.mvtoestq
>  FOR EACH ROW
>  EXECUTE PROCEDURE fbupdelMvtoEstq();
>
> CREATE TRIGGER tr_mvtoestq_upde
>  AFTER DELETE OR UPDATE
>  ON gestao.mvtoestq
>  FOR EACH ROW
>  EXECUTE PROCEDURE fupdelMvtoEstq();
>
> CREATE TRIGGER tr_mvtoestq_bins
>  BEFORE INSERT
>  ON gestao.mvtoestq
>  FOR EACH ROW
>  EXECUTE PROCEDURE fbinMvtoEstq();
>
> CREATE TRIGGER tr_mvtoestq_ins
>  AFTER INSERT
>  ON gestao.mvtoestq
>  FOR EACH ROW
>  EXECUTE PROCEDURE finMvtoEstq();
>
> CREATE OR REPLACE RULE RL_MvtoEstq_Ins AS ON INSERT TO public.mvtoestq DO
> INSTEAD
>  INSERT INTO gestao.MVTOESTQ ( EMPRESA, FILIAL, MOVIMENTO, SEQESTOQUE,
>  50 campos... )
>
> CREATE OR REPLACE RULE RL_MvtoEstq_Upd AS ON UPDATE TO public.mvtoestq DO
> INSTEAD
>    UPDATE gestao.MvtoEstq
>    SET
>      EMPPRODUT = NEW.EMPPRODUT,
>      ... 50 campos
>    WHERE Movimento = OLD.Movimento
>      AND SeqEstoque = OLD.SeqEstoque
>      AND Filial = OLD.Filial
>      AND Empresa = OLD.Empresa;
>
> CREATE OR REPLACE RULE RL_MvtoEstq_Del AS ON DELETE TO public.mvtoestq DO
> INSTEAD
>    DELETE FROM gestao.MvtoEstq
>    WHERE Movimento = OLD.Movimento
>      AND SeqEstoque = OLD.SeqEstoque
>      AND Filial = OLD.Filial
>      AND Empresa = OLD.Empresa;
>
> Troquei todas as referências a minha tabela dentro das functions por
> "public.mvtoestq" ou "gestao.mvtoestq". O problema é que, quando eu chego
> num
> comando DELETE dentro de uma function chamada pela trigger, o Postgres
> reporta
> o erro "ERROR: record 'new' is not assigned yet The tuple structure of a
> not-yet-assigned record is indeterminate. ...".


     Sinto muito, mas realmente ele está certo. Não existe variável "NEW" em
um gatilho de DELETE. Somente OLD, assim como não existe OLD em um gatilho
de INSERT.

      Sugestão 1: veja qual o tipo de gatilho disparou o mesmo: TG_OP ilike
'delete'
      Sugestão 1.1: crie uma variável do tipo da tabela e atribua OLD ou NEW
para a mesma.
       (...)
                 DECLARE ref tabela%ROWTYPE;
                 BEGIN
                          IF TG_OP ILIKE 'DELETE' THEN
                                ref := OLD;
                          ELSE ref := NEW;
                  END IF;
        (...)

Obs.: Não sei dizer se a atribuição é por cópia ou valor. Ou seja, não sei
dizer se, caso atribua NEW para a variável, se o valor será alterado na
tupla que o mesmo representa. Mas caso teste essa solução, por favor, diga
se funciona...

>
>
> O erro acontece exatamente no comando DELETE FROM public.mvtoestq WHERE ...
> ,
> ou seja, quando eu trabalho recursivamente sobre a view. Este comando
> garantidamente não age sobre o registro atualizado originalmente. Pelo que
> entendi, se a trigger estiver na tabela (ao invés da View como no caso do
> Oracle), o Postgres vai continuar empacando no mesmo problema.
>
> Valeu pela tentativa, mas... tem algum jeito de conseguir a mesma
> funcionalidade sem colocar triggers na tabela original?
>
>
> Mozart Hasse
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
William Leite Araújo
Analista de Banco de Dados - QualiConsult
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a