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. ...".

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

Responder a